Merge branch 'master' into coraza_poc_acquis
This commit is contained in:
commit
ee8b31348b
217 changed files with 3347 additions and 3447 deletions
|
@ -3,3 +3,4 @@
|
||||||
#.git
|
#.git
|
||||||
|
|
||||||
/tests
|
/tests
|
||||||
|
/crowdsec-v*
|
||||||
|
|
10
.github/codecov.yml
vendored
Normal file
10
.github/codecov.yml
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# we measure coverage but don't enforce it
|
||||||
|
# https://docs.codecov.com/docs/codecov-yaml
|
||||||
|
coverage:
|
||||||
|
status:
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
target: 0%
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
target: 0%
|
2
.github/workflows/bats-hub.yml
vendored
2
.github/workflows/bats-hub.yml
vendored
|
@ -15,7 +15,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: "Build + tests"
|
name: "Build + tests"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
2
.github/workflows/bats-mysql.yml
vendored
2
.github/workflows/bats-mysql.yml
vendored
|
@ -14,7 +14,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: "Build + tests"
|
name: "Build + tests"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
20
.github/workflows/bats-postgres.yml
vendored
20
.github/workflows/bats-postgres.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: "Build + tests"
|
name: "Build + tests"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -86,24 +86,6 @@ jobs:
|
||||||
PGPASSWORD: "secret"
|
PGPASSWORD: "secret"
|
||||||
PGUSER: postgres
|
PGUSER: postgres
|
||||||
|
|
||||||
# - name: "Build crowdsec and fixture (DB_BACKEND: postgres)"
|
|
||||||
# run: make clean bats-build bats-fixture
|
|
||||||
# env:
|
|
||||||
# DB_BACKEND: postgres
|
|
||||||
# PGHOST: 127.0.0.1
|
|
||||||
# PGPORT: 5432
|
|
||||||
# PGPASSWORD: "secret"
|
|
||||||
# PGUSER: postgres
|
|
||||||
#
|
|
||||||
# - name: "Run tests (DB_BACKEND: postgres)"
|
|
||||||
# run: make bats-test
|
|
||||||
# env:
|
|
||||||
# DB_BACKEND: postgres
|
|
||||||
# PGHOST: 127.0.0.1
|
|
||||||
# PGPORT: 5432
|
|
||||||
# PGPASSWORD: "secret"
|
|
||||||
# PGUSER: postgres
|
|
||||||
|
|
||||||
- name: "Show stack traces"
|
- name: "Show stack traces"
|
||||||
run: for file in $(find /tmp/crowdsec-crash.*.txt); do echo ">>>>> $file"; cat $file; echo; done
|
run: for file in $(find /tmp/crowdsec-crash.*.txt); do echo ">>>>> $file"; cat $file; echo; done
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
|
|
3
.github/workflows/bats-sqlite-coverage.yml
vendored
3
.github/workflows/bats-sqlite-coverage.yml
vendored
|
@ -11,7 +11,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: "Build + tests"
|
name: "Build + tests"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -72,7 +72,6 @@ jobs:
|
||||||
-e '/plugins/notifications' \
|
-e '/plugins/notifications' \
|
||||||
-e '/pkg/protobufs' \
|
-e '/pkg/protobufs' \
|
||||||
-e '/pkg/cwversions' \
|
-e '/pkg/cwversions' \
|
||||||
-e '/pkg/cstest' \
|
|
||||||
-e '/pkg/models' \
|
-e '/pkg/models' \
|
||||||
< coverage-bats-raw.out \
|
< coverage-bats-raw.out \
|
||||||
> coverage-bats.out
|
> coverage-bats.out
|
||||||
|
|
2
.github/workflows/ci-windows-build-msi.yml
vendored
2
.github/workflows/ci-windows-build-msi.yml
vendored
|
@ -23,7 +23,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: Build
|
name: Build
|
||||||
runs-on: windows-2019
|
runs-on: windows-2019
|
||||||
|
|
2
.github/workflows/go-tests-windows.yml
vendored
2
.github/workflows/go-tests-windows.yml
vendored
|
@ -22,7 +22,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: "Build + tests"
|
name: "Build + tests"
|
||||||
runs-on: windows-2022
|
runs-on: windows-2022
|
||||||
|
|
2
.github/workflows/go-tests.yml
vendored
2
.github/workflows/go-tests.yml
vendored
|
@ -34,7 +34,7 @@ jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: "Build + tests"
|
name: "Build + tests"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
70
.github/workflows/publish_docker-image_on_master-debian.yml
vendored
Normal file
70
.github/workflows/publish_docker-image_on_master-debian.yml
vendored
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
name: Publish Debian Docker image on Push to Master
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
paths:
|
||||||
|
- 'pkg/**'
|
||||||
|
- 'cmd/**'
|
||||||
|
- 'plugins/**'
|
||||||
|
- 'docker/docker_start.sh'
|
||||||
|
- 'docker/config.yaml'
|
||||||
|
- '.github/workflows/publish_docker-image_on_master-debian.yml'
|
||||||
|
- 'Dockerfile.debian'
|
||||||
|
- 'go.mod'
|
||||||
|
- 'go.sum'
|
||||||
|
- 'Makefile'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
push_to_registry:
|
||||||
|
name: Push Debian Docker image to Docker Hub
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Check out the repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Prepare
|
||||||
|
id: prep
|
||||||
|
run: |
|
||||||
|
DOCKER_IMAGE=crowdsecurity/crowdsec
|
||||||
|
GHCR_IMAGE=ghcr.io/${{ github.repository_owner }}/crowdsec
|
||||||
|
VERSION=dev-debian
|
||||||
|
TAGS="${DOCKER_IMAGE}:${VERSION},${GHCR_IMAGE}:${VERSION}"
|
||||||
|
echo "tags=${TAGS}" >> $GITHUB_OUTPUT
|
||||||
|
echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
with:
|
||||||
|
config: .github/buildkit.toml
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.repository_owner }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push full image
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile.debian
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
|
platforms: linux/amd64
|
||||||
|
labels: |
|
||||||
|
org.opencontainers.image.source=${{ github.event.repository.html_url }}
|
||||||
|
org.opencontainers.image.created=${{ steps.prep.outputs.created }}
|
||||||
|
org.opencontainers.image.revision=${{ github.sha }}
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=min
|
12
.github/workflows/release_publish-package.yml
vendored
12
.github/workflows/release_publish-package.yml
vendored
|
@ -6,11 +6,15 @@ on:
|
||||||
types:
|
types:
|
||||||
- prereleased
|
- prereleased
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
# Use write for: hub release edit
|
||||||
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go-version: ["1.20.3"]
|
go-version: ["1.20.4"]
|
||||||
|
|
||||||
name: Build and upload binary package
|
name: Build and upload binary package
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -43,8 +47,8 @@ jobs:
|
||||||
run: make release
|
run: make release
|
||||||
|
|
||||||
- name: Upload to release
|
- name: Upload to release
|
||||||
uses: JasonEtco/upload-to-release@master
|
|
||||||
with:
|
|
||||||
args: crowdsec-release.tgz application/x-gzip
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: |
|
||||||
|
tag_name="${GITHUB_REF##*/}"
|
||||||
|
hub release edit -a crowdsec-release.tgz -m "" "$tag_name"
|
||||||
|
|
|
@ -29,7 +29,7 @@ jobs:
|
||||||
VERSION=pr-${{ github.event.number }}
|
VERSION=pr-${{ github.event.number }}
|
||||||
fi
|
fi
|
||||||
TAGS="${DOCKER_IMAGE}:${VERSION}-debian"
|
TAGS="${DOCKER_IMAGE}:${VERSION}-debian"
|
||||||
if [[ ${{ github.event.action }} == released ]]; then
|
if [[ "${{ github.event.action }}" == "released" ]]; then
|
||||||
TAGS=$TAGS,${DOCKER_IMAGE}:latest-debian
|
TAGS=$TAGS,${DOCKER_IMAGE}:latest-debian
|
||||||
fi
|
fi
|
||||||
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
||||||
|
@ -54,7 +54,7 @@ jobs:
|
||||||
file: ./Dockerfile.debian
|
file: ./Dockerfile.debian
|
||||||
push: ${{ github.event_name != 'pull_request' }}
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
tags: ${{ steps.prep.outputs.tags }}
|
tags: ${{ steps.prep.outputs.tags }}
|
||||||
platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6,linux/386
|
platforms: linux/amd64,linux/arm64,linux/386
|
||||||
labels: |
|
labels: |
|
||||||
org.opencontainers.image.source=${{ github.event.repository.html_url }}
|
org.opencontainers.image.source=${{ github.event.repository.html_url }}
|
||||||
org.opencontainers.image.created=${{ steps.prep.outputs.created }}
|
org.opencontainers.image.created=${{ steps.prep.outputs.created }}
|
||||||
|
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -8,10 +8,17 @@
|
||||||
.pc
|
.pc
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
|
# If vendor is included, allow prebuilt (wasm?) libraries.
|
||||||
|
!vendor/**/*.so
|
||||||
|
|
||||||
# Test binaries, built with `go test -c`
|
# Test binaries, built with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
*.cover
|
*.cover
|
||||||
|
|
||||||
|
# VMs used for dev/test
|
||||||
|
|
||||||
|
.vagrant
|
||||||
|
|
||||||
# Test binaries, built from *_test.go
|
# Test binaries, built from *_test.go
|
||||||
pkg/csplugin/tests/cs_plugin_test*
|
pkg/csplugin/tests/cs_plugin_test*
|
||||||
|
|
||||||
|
|
14
Dockerfile
14
Dockerfile
|
@ -1,5 +1,5 @@
|
||||||
# vim: set ft=dockerfile:
|
# vim: set ft=dockerfile:
|
||||||
ARG GOVERSION=1.20.3
|
ARG GOVERSION=1.20.4
|
||||||
|
|
||||||
FROM golang:${GOVERSION}-alpine AS build
|
FROM golang:${GOVERSION}-alpine AS build
|
||||||
|
|
||||||
|
@ -7,9 +7,19 @@ WORKDIR /go/src/crowdsec
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
# Alpine does not ship a static version of re2, we can build it ourselves
|
||||||
|
# Later versions require 'abseil', which is likewise not available in its static form
|
||||||
|
ENV RE2_VERSION=2023-03-01
|
||||||
|
|
||||||
# wizard.sh requires GNU coreutils
|
# wizard.sh requires GNU coreutils
|
||||||
RUN apk add --no-cache git gcc libc-dev make bash gettext binutils-gold coreutils && \
|
RUN apk add --no-cache git g++ gcc libc-dev make bash gettext binutils-gold coreutils icu-static re2-dev pkgconfig && \
|
||||||
|
wget https://github.com/google/re2/archive/refs/tags/${RE2_VERSION}.tar.gz && \
|
||||||
|
tar -xzf ${RE2_VERSION}.tar.gz && \
|
||||||
|
cd re2-${RE2_VERSION} && \
|
||||||
|
make && \
|
||||||
|
make install && \
|
||||||
echo "githubciXXXXXXXXXXXXXXXXXXXXXXXX" > /etc/machine-id && \
|
echo "githubciXXXXXXXXXXXXXXXXXXXXXXXX" > /etc/machine-id && \
|
||||||
|
cd - && \
|
||||||
make clean release DOCKER_BUILD=1 && \
|
make clean release DOCKER_BUILD=1 && \
|
||||||
cd crowdsec-v* && \
|
cd crowdsec-v* && \
|
||||||
./wizard.sh --docker-mode && \
|
./wizard.sh --docker-mode && \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# vim: set ft=dockerfile:
|
# vim: set ft=dockerfile:
|
||||||
ARG GOVERSION=1.20.3
|
ARG GOVERSION=1.20.4
|
||||||
|
|
||||||
FROM golang:${GOVERSION}-bullseye AS build
|
FROM golang:${GOVERSION}-bullseye AS build
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ ENV DEBCONF_NOWARNINGS="yes"
|
||||||
|
|
||||||
# wizard.sh requires GNU coreutils
|
# wizard.sh requires GNU coreutils
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y -q git gcc libc-dev make bash gettext binutils-gold coreutils tzdata && \
|
apt-get install -y -q git gcc libc-dev make bash gettext binutils-gold coreutils tzdata libre2-dev && \
|
||||||
echo "githubciXXXXXXXXXXXXXXXXXXXXXXXX" > /etc/machine-id && \
|
echo "githubciXXXXXXXXXXXXXXXXXXXXXXXX" > /etc/machine-id && \
|
||||||
make clean release DOCKER_BUILD=1 && \
|
make clean release DOCKER_BUILD=1 && \
|
||||||
cd crowdsec-v* && \
|
cd crowdsec-v* && \
|
||||||
|
@ -44,6 +44,9 @@ RUN apt-get update && \
|
||||||
mkdir -p /staging/var/lib/crowdsec && \
|
mkdir -p /staging/var/lib/crowdsec && \
|
||||||
mkdir -p /var/lib/crowdsec/data
|
mkdir -p /var/lib/crowdsec/data
|
||||||
|
|
||||||
|
RUN echo "deb http://deb.debian.org/debian bullseye-backports main" >> /etc/apt/sources.list \
|
||||||
|
&& apt-get update && apt-get install -t bullseye-backports -y libsystemd0
|
||||||
|
|
||||||
COPY --from=build /go/bin/yq /usr/local/bin/yq
|
COPY --from=build /go/bin/yq /usr/local/bin/yq
|
||||||
COPY --from=build /etc/crowdsec /staging/etc/crowdsec
|
COPY --from=build /etc/crowdsec /staging/etc/crowdsec
|
||||||
COPY --from=build /usr/local/bin/crowdsec /usr/local/bin/crowdsec
|
COPY --from=build /usr/local/bin/crowdsec /usr/local/bin/crowdsec
|
||||||
|
|
147
Makefile
147
Makefile
|
@ -1,36 +1,42 @@
|
||||||
include mk/platform.mk
|
include mk/platform.mk
|
||||||
|
|
||||||
|
BUILD_REQUIRE_GO_MAJOR ?= 1
|
||||||
|
BUILD_REQUIRE_GO_MINOR ?= 20
|
||||||
|
|
||||||
|
GOCMD = go
|
||||||
|
GOTEST = $(GOCMD) test
|
||||||
|
|
||||||
|
BUILD_CODENAME ?= alphaga
|
||||||
|
|
||||||
CROWDSEC_FOLDER = ./cmd/crowdsec
|
CROWDSEC_FOLDER = ./cmd/crowdsec
|
||||||
CSCLI_FOLDER = ./cmd/crowdsec-cli/
|
CSCLI_FOLDER = ./cmd/crowdsec-cli/
|
||||||
|
|
||||||
HTTP_PLUGIN_FOLDER = ./plugins/notifications/http
|
PLUGINS ?= $(patsubst ./plugins/notifications/%,%,$(wildcard ./plugins/notifications/*))
|
||||||
SLACK_PLUGIN_FOLDER = ./plugins/notifications/slack
|
PLUGINS_DIR = ./plugins/notifications
|
||||||
SPLUNK_PLUGIN_FOLDER = ./plugins/notifications/splunk
|
|
||||||
EMAIL_PLUGIN_FOLDER = ./plugins/notifications/email
|
|
||||||
DUMMY_PLUGIN_FOLDER = ./plugins/notifications/dummy
|
|
||||||
|
|
||||||
HTTP_PLUGIN_BIN = notification-http$(EXT)
|
|
||||||
SLACK_PLUGIN_BIN = notification-slack$(EXT)
|
|
||||||
SPLUNK_PLUGIN_BIN = notification-splunk$(EXT)
|
|
||||||
EMAIL_PLUGIN_BIN = notification-email$(EXT)
|
|
||||||
DUMMY_PLUGIN_BIN= notification-dummy$(EXT)
|
|
||||||
|
|
||||||
HTTP_PLUGIN_CONFIG = http.yaml
|
|
||||||
SLACK_PLUGIN_CONFIG = slack.yaml
|
|
||||||
SPLUNK_PLUGIN_CONFIG = splunk.yaml
|
|
||||||
EMAIL_PLUGIN_CONFIG = email.yaml
|
|
||||||
|
|
||||||
CROWDSEC_BIN = crowdsec$(EXT)
|
CROWDSEC_BIN = crowdsec$(EXT)
|
||||||
CSCLI_BIN = cscli$(EXT)
|
CSCLI_BIN = cscli$(EXT)
|
||||||
BUILD_CMD = build
|
|
||||||
|
# Directory for the release files
|
||||||
|
RELDIR = crowdsec-$(BUILD_VERSION)
|
||||||
|
|
||||||
GO_MODULE_NAME = github.com/crowdsecurity/crowdsec
|
GO_MODULE_NAME = github.com/crowdsecurity/crowdsec
|
||||||
|
|
||||||
|
# see if we have libre2-dev installed for C++ optimizations
|
||||||
|
RE2_CHECK := $(shell pkg-config --libs re2 2>/dev/null)
|
||||||
|
|
||||||
|
#--------------------------------------
|
||||||
|
#
|
||||||
|
# Define MAKE_FLAGS and LD_OPTS for the sub-makefiles in cmd/ and plugins/
|
||||||
|
#
|
||||||
|
|
||||||
|
MAKE_FLAGS = --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
||||||
|
|
||||||
LD_OPTS_VARS= \
|
LD_OPTS_VARS= \
|
||||||
-X '$(GO_MODULE_NAME)/pkg/cwversion.Version=$(BUILD_VERSION)' \
|
-X 'github.com/crowdsecurity/go-cs-lib/pkg/version.Version=$(BUILD_VERSION)' \
|
||||||
-X '$(GO_MODULE_NAME)/pkg/cwversion.BuildDate=$(BUILD_TIMESTAMP)' \
|
-X 'github.com/crowdsecurity/go-cs-lib/pkg/version.BuildDate=$(BUILD_TIMESTAMP)' \
|
||||||
|
-X 'github.com/crowdsecurity/go-cs-lib/pkg/version.Tag=$(BUILD_TAG)' \
|
||||||
-X '$(GO_MODULE_NAME)/pkg/cwversion.Codename=$(BUILD_CODENAME)' \
|
-X '$(GO_MODULE_NAME)/pkg/cwversion.Codename=$(BUILD_CODENAME)' \
|
||||||
-X '$(GO_MODULE_NAME)/pkg/cwversion.Tag=$(BUILD_TAG)' \
|
|
||||||
-X '$(GO_MODULE_NAME)/pkg/csconfig.defaultConfigDir=$(DEFAULT_CONFIGDIR)' \
|
-X '$(GO_MODULE_NAME)/pkg/csconfig.defaultConfigDir=$(DEFAULT_CONFIGDIR)' \
|
||||||
-X '$(GO_MODULE_NAME)/pkg/csconfig.defaultDataDir=$(DEFAULT_DATADIR)'
|
-X '$(GO_MODULE_NAME)/pkg/csconfig.defaultDataDir=$(DEFAULT_DATADIR)'
|
||||||
|
|
||||||
|
@ -38,66 +44,67 @@ ifneq (,$(DOCKER_BUILD))
|
||||||
LD_OPTS_VARS += -X '$(GO_MODULE_NAME)/pkg/cwversion.System=docker'
|
LD_OPTS_VARS += -X '$(GO_MODULE_NAME)/pkg/cwversion.System=docker'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef BUILD_STATIC
|
GO_TAGS := netgo,osusergo,sqlite_omit_load_extension
|
||||||
$(warning WARNING: The BUILD_STATIC variable is deprecated and has no effect. Builds are static by default since v1.5.0.)
|
|
||||||
|
ifneq (,$(RE2_CHECK))
|
||||||
|
# += adds a space that we don't want
|
||||||
|
GO_TAGS := $(GO_TAGS),re2_cgo
|
||||||
|
LD_OPTS_VARS += -X '$(GO_MODULE_NAME)/pkg/cwversion.Libre2=C++'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
export LD_OPTS=-ldflags "-s -w -extldflags '-static' $(LD_OPTS_VARS)" \
|
export LD_OPTS=-ldflags "-s -w -extldflags '-static' $(LD_OPTS_VARS)" \
|
||||||
-trimpath -tags netgo,osusergo,sqlite_omit_load_extension
|
-trimpath -tags $(GO_TAGS)
|
||||||
|
|
||||||
ifneq (,$(TEST_COVERAGE))
|
ifneq (,$(TEST_COVERAGE))
|
||||||
LD_OPTS += -cover
|
LD_OPTS += -cover
|
||||||
endif
|
endif
|
||||||
|
|
||||||
GOCMD = go
|
#--------------------------------------
|
||||||
GOTEST = $(GOCMD) test
|
|
||||||
|
|
||||||
RELDIR = crowdsec-$(BUILD_VERSION)
|
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build
|
||||||
build: goversion crowdsec cscli plugins
|
build: pre-build goversion crowdsec cscli plugins
|
||||||
|
|
||||||
|
.PHONY: pre-build
|
||||||
|
pre-build:
|
||||||
|
ifdef BUILD_STATIC
|
||||||
|
$(warning WARNING: The BUILD_STATIC variable is deprecated and has no effect. Builds are static by default since v1.5.0.)
|
||||||
|
endif
|
||||||
|
$(info Building $(BUILD_VERSION) ($(BUILD_TAG)) for $(GOOS)/$(GOARCH))
|
||||||
|
ifneq (,$(RE2_CHECK))
|
||||||
|
$(info Using C++ regexp library)
|
||||||
|
else
|
||||||
|
$(info Fallback to WebAssembly regexp library. To use the C++ version, make sure you have installed libre2-dev and pkg-config.)
|
||||||
|
endif
|
||||||
|
$(info )
|
||||||
|
|
||||||
.PHONY: all
|
.PHONY: all
|
||||||
all: clean test build
|
all: clean test build
|
||||||
|
|
||||||
.PHONY: plugins
|
.PHONY: plugins
|
||||||
plugins: http-plugin slack-plugin splunk-plugin email-plugin dummy-plugin
|
plugins:
|
||||||
|
@$(foreach plugin,$(PLUGINS), \
|
||||||
|
$(MAKE) -C $(PLUGINS_DIR)/$(plugin) build $(MAKE_FLAGS); \
|
||||||
|
)
|
||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean: testclean
|
clean: testclean
|
||||||
@$(MAKE) -C $(CROWDSEC_FOLDER) clean --no-print-directory RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
@$(MAKE) -C $(CROWDSEC_FOLDER) clean $(MAKE_FLAGS)
|
||||||
@$(MAKE) -C $(CSCLI_FOLDER) clean --no-print-directory RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
@$(MAKE) -C $(CSCLI_FOLDER) clean $(MAKE_FLAGS)
|
||||||
@$(RM) $(CROWDSEC_BIN) $(WIN_IGNORE_ERR)
|
@$(RM) $(CROWDSEC_BIN) $(WIN_IGNORE_ERR)
|
||||||
@$(RM) $(CSCLI_BIN) $(WIN_IGNORE_ERR)
|
@$(RM) $(CSCLI_BIN) $(WIN_IGNORE_ERR)
|
||||||
@$(RM) *.log $(WIN_IGNORE_ERR)
|
@$(RM) *.log $(WIN_IGNORE_ERR)
|
||||||
@$(RM) crowdsec-release.tgz $(WIN_IGNORE_ERR)
|
@$(RM) crowdsec-release.tgz $(WIN_IGNORE_ERR)
|
||||||
@$(RM) $(HTTP_PLUGIN_FOLDER)/$(HTTP_PLUGIN_BIN) $(WIN_IGNORE_ERR)
|
@$(foreach plugin,$(PLUGINS), \
|
||||||
@$(RM) $(SLACK_PLUGIN_FOLDER)/$(SLACK_PLUGIN_BIN) $(WIN_IGNORE_ERR)
|
$(MAKE) -C $(PLUGINS_DIR)/$(plugin) clean $(MAKE_FLAGS); \
|
||||||
@$(RM) $(SPLUNK_PLUGIN_FOLDER)/$(SPLUNK_PLUGIN_BIN) $(WIN_IGNORE_ERR)
|
)
|
||||||
@$(RM) $(EMAIL_PLUGIN_FOLDER)/$(EMAIL_PLUGIN_BIN) $(WIN_IGNORE_ERR)
|
|
||||||
@$(RM) $(DUMMY_PLUGIN_FOLDER)/$(DUMMY_PLUGIN_BIN) $(WIN_IGNORE_ERR)
|
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: cscli
|
||||||
cscli: goversion
|
cscli: goversion
|
||||||
@$(MAKE) -C $(CSCLI_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
@$(MAKE) -C $(CSCLI_FOLDER) build $(MAKE_FLAGS)
|
||||||
|
|
||||||
|
.PHONY: crowdsec
|
||||||
crowdsec: goversion
|
crowdsec: goversion
|
||||||
@$(MAKE) -C $(CROWDSEC_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
@$(MAKE) -C $(CROWDSEC_FOLDER) build $(MAKE_FLAGS)
|
||||||
|
|
||||||
http-plugin: goversion
|
|
||||||
@$(MAKE) -C $(HTTP_PLUGIN_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
|
||||||
|
|
||||||
slack-plugin: goversion
|
|
||||||
@$(MAKE) -C $(SLACK_PLUGIN_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
|
||||||
|
|
||||||
splunk-plugin: goversion
|
|
||||||
@$(MAKE) -C $(SPLUNK_PLUGIN_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
|
||||||
|
|
||||||
email-plugin: goversion
|
|
||||||
@$(MAKE) -C $(EMAIL_PLUGIN_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
|
||||||
|
|
||||||
dummy-plugin: goversion
|
|
||||||
$(MAKE) -C $(DUMMY_PLUGIN_FOLDER) build --no-print-directory GOARCH=$(GOARCH) GOOS=$(GOOS) RM="$(RM)" WIN_IGNORE_ERR="$(WIN_IGNORE_ERR)" CP="$(CP)" CPR="$(CPR)" MKDIR="$(MKDIR)"
|
|
||||||
|
|
||||||
.PHONY: testclean
|
.PHONY: testclean
|
||||||
testclean: bats-clean
|
testclean: bats-clean
|
||||||
|
@ -130,35 +137,33 @@ localstack:
|
||||||
localstack-stop:
|
localstack-stop:
|
||||||
docker-compose -f test/localstack/docker-compose.yml down
|
docker-compose -f test/localstack/docker-compose.yml down
|
||||||
|
|
||||||
package-common:
|
.PHONY: vendor
|
||||||
|
vendor:
|
||||||
|
@echo "Vendoring dependencies"
|
||||||
|
@$(GOCMD) mod vendor
|
||||||
|
@$(foreach plugin,$(PLUGINS), \
|
||||||
|
$(MAKE) -C $(PLUGINS_DIR)/$(plugin) vendor $(MAKE_FLAGS); \
|
||||||
|
)
|
||||||
|
|
||||||
|
.PHONY: package
|
||||||
|
package:
|
||||||
@echo "Building Release to dir $(RELDIR)"
|
@echo "Building Release to dir $(RELDIR)"
|
||||||
@$(MKDIR) $(RELDIR)/cmd/crowdsec
|
@$(MKDIR) $(RELDIR)/cmd/crowdsec
|
||||||
@$(MKDIR) $(RELDIR)/cmd/crowdsec-cli
|
@$(MKDIR) $(RELDIR)/cmd/crowdsec-cli
|
||||||
@$(MKDIR) $(RELDIR)/$(subst ./,,$(HTTP_PLUGIN_FOLDER))
|
|
||||||
@$(MKDIR) $(RELDIR)/$(subst ./,,$(SLACK_PLUGIN_FOLDER))
|
|
||||||
@$(MKDIR) $(RELDIR)/$(subst ./,,$(SPLUNK_PLUGIN_FOLDER))
|
|
||||||
@$(MKDIR) $(RELDIR)/$(subst ./,,$(EMAIL_PLUGIN_FOLDER))
|
|
||||||
|
|
||||||
@$(CP) $(CROWDSEC_FOLDER)/$(CROWDSEC_BIN) $(RELDIR)/cmd/crowdsec
|
@$(CP) $(CROWDSEC_FOLDER)/$(CROWDSEC_BIN) $(RELDIR)/cmd/crowdsec
|
||||||
@$(CP) $(CSCLI_FOLDER)/$(CSCLI_BIN) $(RELDIR)/cmd/crowdsec-cli
|
@$(CP) $(CSCLI_FOLDER)/$(CSCLI_BIN) $(RELDIR)/cmd/crowdsec-cli
|
||||||
|
|
||||||
@$(CP) $(HTTP_PLUGIN_FOLDER)/$(HTTP_PLUGIN_BIN) $(RELDIR)/$(subst ./,,$(HTTP_PLUGIN_FOLDER))
|
@$(foreach plugin,$(PLUGINS), \
|
||||||
@$(CP) $(SLACK_PLUGIN_FOLDER)/$(SLACK_PLUGIN_BIN) $(RELDIR)/$(subst ./,,$(SLACK_PLUGIN_FOLDER))
|
$(MKDIR) $(RELDIR)/$(PLUGINS_DIR)/$(plugin); \
|
||||||
@$(CP) $(SPLUNK_PLUGIN_FOLDER)/$(SPLUNK_PLUGIN_BIN) $(RELDIR)/$(subst ./,,$(SPLUNK_PLUGIN_FOLDER))
|
$(CP) $(PLUGINS_DIR)/$(plugin)/notification-$(plugin)$(EXT) $(RELDIR)/$(PLUGINS_DIR)/$(plugin); \
|
||||||
@$(CP) $(EMAIL_PLUGIN_FOLDER)/$(EMAIL_PLUGIN_BIN) $(RELDIR)/$(subst ./,,$(EMAIL_PLUGIN_FOLDER))
|
$(CP) $(PLUGINS_DIR)/$(plugin)/$(plugin).yaml $(RELDIR)/$(PLUGINS_DIR)/$(plugin)/; \
|
||||||
|
)
|
||||||
@$(CP) $(HTTP_PLUGIN_FOLDER)/$(HTTP_PLUGIN_CONFIG) $(RELDIR)/$(subst ./,,$(HTTP_PLUGIN_FOLDER))
|
|
||||||
@$(CP) $(SLACK_PLUGIN_FOLDER)/$(SLACK_PLUGIN_CONFIG) $(RELDIR)/$(subst ./,,$(SLACK_PLUGIN_FOLDER))
|
|
||||||
@$(CP) $(SPLUNK_PLUGIN_FOLDER)/$(SPLUNK_PLUGIN_CONFIG) $(RELDIR)/$(subst ./,,$(SPLUNK_PLUGIN_FOLDER))
|
|
||||||
@$(CP) $(EMAIL_PLUGIN_FOLDER)/$(EMAIL_PLUGIN_CONFIG) $(RELDIR)/$(subst ./,,$(EMAIL_PLUGIN_FOLDER))
|
|
||||||
|
|
||||||
@$(CPR) ./config $(RELDIR)
|
@$(CPR) ./config $(RELDIR)
|
||||||
@$(CP) wizard.sh $(RELDIR)
|
@$(CP) wizard.sh $(RELDIR)
|
||||||
@$(CP) scripts/test_env.sh $(RELDIR)
|
@$(CP) scripts/test_env.sh $(RELDIR)
|
||||||
@$(CP) scripts/test_env.ps1 $(RELDIR)
|
@$(CP) scripts/test_env.ps1 $(RELDIR)
|
||||||
|
|
||||||
.PHONY: package
|
|
||||||
package: package-common
|
|
||||||
@tar cvzf crowdsec-release.tgz $(RELDIR)
|
@tar cvzf crowdsec-release.tgz $(RELDIR)
|
||||||
|
|
||||||
.PHONY: check_release
|
.PHONY: check_release
|
||||||
|
|
|
@ -27,7 +27,7 @@ stages:
|
||||||
- task: GoTool@0
|
- task: GoTool@0
|
||||||
displayName: "Install Go 1.20"
|
displayName: "Install Go 1.20"
|
||||||
inputs:
|
inputs:
|
||||||
version: '1.20.3'
|
version: '1.20.4'
|
||||||
|
|
||||||
- pwsh: |
|
- pwsh: |
|
||||||
choco install -y make
|
choco install -y make
|
||||||
|
|
|
@ -7,9 +7,7 @@ endif
|
||||||
# Go parameters
|
# Go parameters
|
||||||
GOCMD = go
|
GOCMD = go
|
||||||
GOBUILD = $(GOCMD) build
|
GOBUILD = $(GOCMD) build
|
||||||
GOCLEAN = $(GOCMD) clean
|
|
||||||
GOTEST = $(GOCMD) test
|
GOTEST = $(GOCMD) test
|
||||||
GOGET = $(GOCMD) get
|
|
||||||
|
|
||||||
BINARY_NAME = cscli$(EXT)
|
BINARY_NAME = cscli$(EXT)
|
||||||
PREFIX ?= "/"
|
PREFIX ?= "/"
|
||||||
|
|
|
@ -20,8 +20,9 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
|
@ -219,7 +220,7 @@ func NewAlertsCmd() *cobra.Command {
|
||||||
Client, err = apiclient.NewClient(&apiclient.Config{
|
Client, err = apiclient.NewClient(&apiclient.Config{
|
||||||
MachineID: csConfig.API.Client.Credentials.Login,
|
MachineID: csConfig.API.Client.Credentials.Login,
|
||||||
Password: strfmt.Password(csConfig.API.Client.Credentials.Password),
|
Password: strfmt.Password(csConfig.API.Client.Credentials.Password),
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
|
||||||
middlewares "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
|
middlewares "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
|
@ -122,7 +123,6 @@ func runBouncersAdd(cmd *cobra.Command, args []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func NewBouncersAddCmd() *cobra.Command {
|
func NewBouncersAddCmd() *cobra.Command {
|
||||||
cmdBouncersAdd := &cobra.Command{
|
cmdBouncersAdd := &cobra.Command{
|
||||||
Use: "add MyBouncerName [--length 16]",
|
Use: "add MyBouncerName [--length 16]",
|
||||||
|
@ -144,7 +144,6 @@ cscli bouncers add MyBouncerName -k <random-key>`,
|
||||||
return cmdBouncersAdd
|
return cmdBouncersAdd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func runBouncersDelete(cmd *cobra.Command, args []string) error {
|
func runBouncersDelete(cmd *cobra.Command, args []string) error {
|
||||||
for _, bouncerID := range args {
|
for _, bouncerID := range args {
|
||||||
err := dbClient.DeleteBouncer(bouncerID)
|
err := dbClient.DeleteBouncer(bouncerID)
|
||||||
|
@ -157,7 +156,6 @@ func runBouncersDelete(cmd *cobra.Command, args []string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func NewBouncersDeleteCmd() *cobra.Command {
|
func NewBouncersDeleteCmd() *cobra.Command {
|
||||||
cmdBouncersDelete := &cobra.Command{
|
cmdBouncersDelete := &cobra.Command{
|
||||||
Use: "delete MyBouncerName",
|
Use: "delete MyBouncerName",
|
||||||
|
@ -178,7 +176,7 @@ func NewBouncersDeleteCmd() *cobra.Command {
|
||||||
}
|
}
|
||||||
ret := make([]string, 0)
|
ret := make([]string, 0)
|
||||||
for _, bouncer := range bouncers {
|
for _, bouncer := range bouncers {
|
||||||
if strings.Contains(bouncer.Name, toComplete) && !inSlice(bouncer.Name, args) {
|
if strings.Contains(bouncer.Name, toComplete) && !slices.Contains(args, bouncer.Name) {
|
||||||
ret = append(ret, bouncer.Name)
|
ret = append(ret, bouncer.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,10 +6,11 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/fflag"
|
"github.com/crowdsecurity/crowdsec/pkg/fflag"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
|
@ -70,7 +71,7 @@ func NewCapiRegisterCmd() *cobra.Command {
|
||||||
_, err = apiclient.RegisterClient(&apiclient.Config{
|
_, err = apiclient.RegisterClient(&apiclient.Config{
|
||||||
MachineID: capiUser,
|
MachineID: capiUser,
|
||||||
Password: password,
|
Password: password,
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiurl,
|
URL: apiurl,
|
||||||
VersionPrefix: CAPIURLPrefix,
|
VersionPrefix: CAPIURLPrefix,
|
||||||
}, nil)
|
}, nil)
|
||||||
|
@ -164,7 +165,7 @@ func NewCapiStatusCmd() *cobra.Command {
|
||||||
log.Fatalf("no scenarios installed, abort")
|
log.Fatalf("no scenarios installed, abort")
|
||||||
}
|
}
|
||||||
|
|
||||||
Client, err = apiclient.NewDefaultClient(apiurl, CAPIURLPrefix, fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()), nil)
|
Client, err = apiclient.NewDefaultClient(apiurl, CAPIURLPrefix, fmt.Sprintf("crowdsec/%s", version.String()), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("init default client: %s", err)
|
log.Fatalf("init default client: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ func NewConfigCmd() *cobra.Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
cmdConfig.AddCommand(NewConfigShowCmd())
|
cmdConfig.AddCommand(NewConfigShowCmd())
|
||||||
|
cmdConfig.AddCommand(NewConfigShowYAMLCmd())
|
||||||
cmdConfig.AddCommand(NewConfigBackupCmd())
|
cmdConfig.AddCommand(NewConfigBackupCmd())
|
||||||
cmdConfig.AddCommand(NewConfigRestoreCmd())
|
cmdConfig.AddCommand(NewConfigRestoreCmd())
|
||||||
cmdConfig.AddCommand(NewConfigFeatureFlagsCmd())
|
cmdConfig.AddCommand(NewConfigFeatureFlagsCmd())
|
||||||
|
|
24
cmd/crowdsec-cli/config_showyaml.go
Normal file
24
cmd/crowdsec-cli/config_showyaml.go
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
)
|
||||||
|
|
||||||
|
func runConfigShowYAML(cmd *cobra.Command, args []string) error {
|
||||||
|
fmt.Println(mergedConfig)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewConfigShowYAMLCmd() *cobra.Command {
|
||||||
|
cmdConfigShow := &cobra.Command{
|
||||||
|
Use: "show-yaml",
|
||||||
|
Short: "Displays merged config.yaml + config.yaml.local",
|
||||||
|
Args: cobra.ExactArgs(0),
|
||||||
|
DisableAutoGenTag: true,
|
||||||
|
RunE: runConfigShowYAML,
|
||||||
|
}
|
||||||
|
|
||||||
|
return cmdConfigShow
|
||||||
|
}
|
|
@ -16,10 +16,12 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/fflag"
|
"github.com/crowdsecurity/crowdsec/pkg/fflag"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
@ -101,7 +103,7 @@ After running this command your will need to validate the enrollment in the weba
|
||||||
MachineID: csConfig.API.Server.OnlineClient.Credentials.Login,
|
MachineID: csConfig.API.Server.OnlineClient.Credentials.Login,
|
||||||
Password: password,
|
Password: password,
|
||||||
Scenarios: scenarios,
|
Scenarios: scenarios,
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v3",
|
VersionPrefix: "v3",
|
||||||
})
|
})
|
||||||
|
@ -249,7 +251,7 @@ func SetConsoleOpts(args []string, wanted bool) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Infof("%s set to %t", csconfig.CONSOLE_MANAGEMENT, wanted)
|
log.Infof("%s set to %t", csconfig.CONSOLE_MANAGEMENT, wanted)
|
||||||
csConfig.API.Server.ConsoleConfig.ConsoleManagement = types.BoolPtr(wanted)
|
csConfig.API.Server.ConsoleConfig.ConsoleManagement = ptr.Of(wanted)
|
||||||
}
|
}
|
||||||
if csConfig.API.Server.OnlineClient.Credentials != nil {
|
if csConfig.API.Server.OnlineClient.Credentials != nil {
|
||||||
changed := false
|
changed := false
|
||||||
|
@ -283,7 +285,7 @@ func SetConsoleOpts(args []string, wanted bool) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Infof("%s set to %t", csconfig.SEND_CUSTOM_SCENARIOS, wanted)
|
log.Infof("%s set to %t", csconfig.SEND_CUSTOM_SCENARIOS, wanted)
|
||||||
csConfig.API.Server.ConsoleConfig.ShareCustomScenarios = types.BoolPtr(wanted)
|
csConfig.API.Server.ConsoleConfig.ShareCustomScenarios = ptr.Of(wanted)
|
||||||
}
|
}
|
||||||
case csconfig.SEND_TAINTED_SCENARIOS:
|
case csconfig.SEND_TAINTED_SCENARIOS:
|
||||||
/*for each flag check if it's already set before setting it*/
|
/*for each flag check if it's already set before setting it*/
|
||||||
|
@ -296,7 +298,7 @@ func SetConsoleOpts(args []string, wanted bool) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Infof("%s set to %t", csconfig.SEND_TAINTED_SCENARIOS, wanted)
|
log.Infof("%s set to %t", csconfig.SEND_TAINTED_SCENARIOS, wanted)
|
||||||
csConfig.API.Server.ConsoleConfig.ShareTaintedScenarios = types.BoolPtr(wanted)
|
csConfig.API.Server.ConsoleConfig.ShareTaintedScenarios = ptr.Of(wanted)
|
||||||
}
|
}
|
||||||
case csconfig.SEND_MANUAL_SCENARIOS:
|
case csconfig.SEND_MANUAL_SCENARIOS:
|
||||||
/*for each flag check if it's already set before setting it*/
|
/*for each flag check if it's already set before setting it*/
|
||||||
|
@ -309,7 +311,7 @@ func SetConsoleOpts(args []string, wanted bool) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Infof("%s set to %t", csconfig.SEND_MANUAL_SCENARIOS, wanted)
|
log.Infof("%s set to %t", csconfig.SEND_MANUAL_SCENARIOS, wanted)
|
||||||
csConfig.API.Server.ConsoleConfig.ShareManualDecisions = types.BoolPtr(wanted)
|
csConfig.API.Server.ConsoleConfig.ShareManualDecisions = ptr.Of(wanted)
|
||||||
}
|
}
|
||||||
case csconfig.SEND_CONTEXT:
|
case csconfig.SEND_CONTEXT:
|
||||||
/*for each flag check if it's already set before setting it*/
|
/*for each flag check if it's already set before setting it*/
|
||||||
|
@ -322,7 +324,7 @@ func SetConsoleOpts(args []string, wanted bool) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Infof("%s set to %t", csconfig.SEND_CONTEXT, wanted)
|
log.Infof("%s set to %t", csconfig.SEND_CONTEXT, wanted)
|
||||||
csConfig.API.Server.ConsoleConfig.ShareContext = types.BoolPtr(wanted)
|
csConfig.API.Server.ConsoleConfig.ShareContext = ptr.Of(wanted)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
log.Fatalf("unknown flag %s", arg)
|
log.Fatalf("unknown flag %s", arg)
|
||||||
|
|
|
@ -19,8 +19,10 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
@ -120,7 +122,7 @@ func NewDecisionsCmd() *cobra.Command {
|
||||||
Client, err = apiclient.NewClient(&apiclient.Config{
|
Client, err = apiclient.NewClient(&apiclient.Config{
|
||||||
MachineID: csConfig.API.Client.Credentials.Login,
|
MachineID: csConfig.API.Client.Credentials.Login,
|
||||||
Password: password,
|
Password: password,
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiurl,
|
URL: apiurl,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -488,6 +490,7 @@ func NewDecisionsImportCmd() *cobra.Command {
|
||||||
importReason string
|
importReason string
|
||||||
importType string
|
importType string
|
||||||
importFile string
|
importFile string
|
||||||
|
batchSize int
|
||||||
)
|
)
|
||||||
|
|
||||||
var cmdDecisionImport = &cobra.Command{
|
var cmdDecisionImport = &cobra.Command{
|
||||||
|
@ -578,37 +581,69 @@ decisions.json :
|
||||||
log.Debugf("'scope' line %d, using supplied value: '%s'", line, importScope)
|
log.Debugf("'scope' line %d, using supplied value: '%s'", line, importScope)
|
||||||
}
|
}
|
||||||
decision := models.Decision{
|
decision := models.Decision{
|
||||||
Value: types.StrPtr(decisionLine.Value),
|
Value: ptr.Of(decisionLine.Value),
|
||||||
Duration: types.StrPtr(decisionLine.Duration),
|
Duration: ptr.Of(decisionLine.Duration),
|
||||||
Origin: types.StrPtr(decisionLine.Origin),
|
Origin: ptr.Of(decisionLine.Origin),
|
||||||
Scenario: types.StrPtr(decisionLine.Scenario),
|
Scenario: ptr.Of(decisionLine.Scenario),
|
||||||
Type: types.StrPtr(decisionLine.Type),
|
Type: ptr.Of(decisionLine.Type),
|
||||||
Scope: types.StrPtr(decisionLine.Scope),
|
Scope: ptr.Of(decisionLine.Scope),
|
||||||
Simulated: new(bool),
|
Simulated: new(bool),
|
||||||
}
|
}
|
||||||
decisionsList = append(decisionsList, &decision)
|
decisionsList = append(decisionsList, &decision)
|
||||||
}
|
}
|
||||||
alerts := models.AddAlertsRequest{}
|
alerts := models.AddAlertsRequest{}
|
||||||
|
|
||||||
|
if batchSize > 0 {
|
||||||
|
for i := 0; i < len(decisionsList); i += batchSize {
|
||||||
|
end := i + batchSize
|
||||||
|
if end > len(decisionsList) {
|
||||||
|
end = len(decisionsList)
|
||||||
|
}
|
||||||
|
decisionBatch := decisionsList[i:end]
|
||||||
importAlert := models.Alert{
|
importAlert := models.Alert{
|
||||||
CreatedAt: time.Now().UTC().Format(time.RFC3339),
|
CreatedAt: time.Now().UTC().Format(time.RFC3339),
|
||||||
Scenario: types.StrPtr(fmt.Sprintf("import %s : %d IPs", importFile, len(decisionsList))),
|
Scenario: ptr.Of(fmt.Sprintf("import %s : %d IPs", importFile, len(decisionBatch))),
|
||||||
Message: types.StrPtr(""),
|
|
||||||
|
Message: ptr.Of(""),
|
||||||
Events: []*models.Event{},
|
Events: []*models.Event{},
|
||||||
Source: &models.Source{
|
Source: &models.Source{
|
||||||
Scope: types.StrPtr(""),
|
Scope: ptr.Of(""),
|
||||||
Value: types.StrPtr(""),
|
Value: ptr.Of(""),
|
||||||
},
|
},
|
||||||
StartAt: types.StrPtr(time.Now().UTC().Format(time.RFC3339)),
|
StartAt: ptr.Of(time.Now().UTC().Format(time.RFC3339)),
|
||||||
StopAt: types.StrPtr(time.Now().UTC().Format(time.RFC3339)),
|
StopAt: ptr.Of(time.Now().UTC().Format(time.RFC3339)),
|
||||||
Capacity: types.Int32Ptr(0),
|
Capacity: ptr.Of(int32(0)),
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
EventsCount: types.Int32Ptr(int32(len(decisionsList))),
|
EventsCount: ptr.Of(int32(len(decisionBatch))),
|
||||||
Leakspeed: types.StrPtr(""),
|
Leakspeed: ptr.Of(""),
|
||||||
ScenarioHash: types.StrPtr(""),
|
ScenarioHash: ptr.Of(""),
|
||||||
ScenarioVersion: types.StrPtr(""),
|
ScenarioVersion: ptr.Of(""),
|
||||||
|
Decisions: decisionBatch,
|
||||||
|
}
|
||||||
|
alerts = append(alerts, &importAlert)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
importAlert := models.Alert{
|
||||||
|
CreatedAt: time.Now().UTC().Format(time.RFC3339),
|
||||||
|
Scenario: ptr.Of(fmt.Sprintf("import %s : %d IPs", importFile, len(decisionsList))),
|
||||||
|
Message: ptr.Of(""),
|
||||||
|
Events: []*models.Event{},
|
||||||
|
Source: &models.Source{
|
||||||
|
Scope: ptr.Of(""),
|
||||||
|
Value: ptr.Of(""),
|
||||||
|
},
|
||||||
|
StartAt: ptr.Of(time.Now().UTC().Format(time.RFC3339)),
|
||||||
|
StopAt: ptr.Of(time.Now().UTC().Format(time.RFC3339)),
|
||||||
|
Capacity: ptr.Of(int32(0)),
|
||||||
|
Simulated: ptr.Of(false),
|
||||||
|
EventsCount: ptr.Of(int32(len(decisionsList))),
|
||||||
|
Leakspeed: ptr.Of(""),
|
||||||
|
ScenarioHash: ptr.Of(""),
|
||||||
|
ScenarioVersion: ptr.Of(""),
|
||||||
Decisions: decisionsList,
|
Decisions: decisionsList,
|
||||||
}
|
}
|
||||||
alerts = append(alerts, &importAlert)
|
alerts = append(alerts, &importAlert)
|
||||||
|
}
|
||||||
|
|
||||||
if len(decisionsList) > 1000 {
|
if len(decisionsList) > 1000 {
|
||||||
log.Infof("You are about to add %d decisions, this may take a while", len(decisionsList))
|
log.Infof("You are about to add %d decisions, this may take a while", len(decisionsList))
|
||||||
|
@ -628,6 +663,7 @@ decisions.json :
|
||||||
cmdDecisionImport.Flags().StringVar(&importScope, "scope", types.Ip, "Decision scope (ie. ip,range,username)")
|
cmdDecisionImport.Flags().StringVar(&importScope, "scope", types.Ip, "Decision scope (ie. ip,range,username)")
|
||||||
cmdDecisionImport.Flags().StringVarP(&importReason, "reason", "R", "", "Decision reason (ie. scenario-name)")
|
cmdDecisionImport.Flags().StringVarP(&importReason, "reason", "R", "", "Decision reason (ie. scenario-name)")
|
||||||
cmdDecisionImport.Flags().StringVarP(&importType, "type", "t", "", "Decision type (ie. ban,captcha,throttle)")
|
cmdDecisionImport.Flags().StringVarP(&importType, "type", "t", "", "Decision type (ie. ban,captcha,throttle)")
|
||||||
|
cmdDecisionImport.Flags().IntVar(&batchSize, "batch", 0, "Split import in batches of N decisions")
|
||||||
|
|
||||||
return cmdDecisionImport
|
return cmdDecisionImport
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/fatih/color"
|
"github.com/fatih/color"
|
||||||
|
@ -98,8 +99,16 @@ Fetches the [.index.json](https://github.com/crowdsecurity/hub/blob/master/.inde
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
if err := cwhub.UpdateHubIdx(csConfig.Hub); err != nil {
|
if err := cwhub.UpdateHubIdx(csConfig.Hub); err != nil {
|
||||||
|
if errors.Is(err, cwhub.ErrIndexNotFound) {
|
||||||
|
log.Warnf("Could not find index file for branch '%s', using 'master'", cwhub.HubBranch)
|
||||||
|
cwhub.HubBranch = "master"
|
||||||
|
if err := cwhub.UpdateHubIdx(csConfig.Hub); err != nil {
|
||||||
|
log.Fatalf("Failed to get Hub index after retry : %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
log.Fatalf("Failed to get Hub index : %v", err)
|
log.Fatalf("Failed to get Hub index : %v", err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//use LocalSync to get warnings about tainted / outdated items
|
//use LocalSync to get warnings about tainted / outdated items
|
||||||
_, warn := cwhub.LocalSync(csConfig.Hub)
|
_, warn := cwhub.LocalSync(csConfig.Hub)
|
||||||
for _, v := range warn {
|
for _, v := range warn {
|
||||||
|
|
|
@ -12,13 +12,15 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/alertcontext"
|
"github.com/crowdsecurity/crowdsec/pkg/alertcontext"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/parser"
|
"github.com/crowdsecurity/crowdsec/pkg/parser"
|
||||||
|
@ -51,7 +53,7 @@ func runLapiStatus(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
Client, err = apiclient.NewDefaultClient(apiurl,
|
Client, err = apiclient.NewDefaultClient(apiurl,
|
||||||
LAPIURLPrefix,
|
LAPIURLPrefix,
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil)
|
nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("init default client: %s", err)
|
log.Fatalf("init default client: %s", err)
|
||||||
|
@ -122,7 +124,7 @@ func runLapiRegister(cmd *cobra.Command, args []string) error {
|
||||||
_, err = apiclient.RegisterClient(&apiclient.Config{
|
_, err = apiclient.RegisterClient(&apiclient.Config{
|
||||||
MachineID: lapiUser,
|
MachineID: lapiUser,
|
||||||
Password: password,
|
Password: password,
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiurl,
|
URL: apiurl,
|
||||||
VersionPrefix: LAPIURLPrefix,
|
VersionPrefix: LAPIURLPrefix,
|
||||||
}, nil)
|
}, nil)
|
||||||
|
@ -258,7 +260,7 @@ cscli lapi context add --key file_source --value evt.Line.Src
|
||||||
}
|
}
|
||||||
data := csConfig.Crowdsec.ContextToSend[keyToAdd]
|
data := csConfig.Crowdsec.ContextToSend[keyToAdd]
|
||||||
for _, val := range valuesToAdd {
|
for _, val := range valuesToAdd {
|
||||||
if !inSlice(val, data) {
|
if !slices.Contains(data, val) {
|
||||||
log.Infof("value '%s' added to key '%s'", val, keyToAdd)
|
log.Infof("value '%s' added to key '%s'", val, keyToAdd)
|
||||||
data = append(data, val)
|
data = append(data, val)
|
||||||
}
|
}
|
||||||
|
@ -332,7 +334,7 @@ cscli lapi context detect crowdsecurity/sshd-logs
|
||||||
|
|
||||||
fieldByParsers := make(map[string][]string)
|
fieldByParsers := make(map[string][]string)
|
||||||
for _, node := range csParsers.Nodes {
|
for _, node := range csParsers.Nodes {
|
||||||
if !detectAll && !inSlice(node.Name, args) {
|
if !detectAll && !slices.Contains(args, node.Name) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !detectAll {
|
if !detectAll {
|
||||||
|
@ -343,7 +345,7 @@ cscli lapi context detect crowdsecurity/sshd-logs
|
||||||
|
|
||||||
subNodeFields := detectSubNode(node, *csParsers.Ctx)
|
subNodeFields := detectSubNode(node, *csParsers.Ctx)
|
||||||
for _, field := range subNodeFields {
|
for _, field := range subNodeFields {
|
||||||
if !inSlice(field, fieldByParsers[node.Name]) {
|
if !slices.Contains(fieldByParsers[node.Name], field) {
|
||||||
fieldByParsers[node.Name] = append(fieldByParsers[node.Name], field)
|
fieldByParsers[node.Name] = append(fieldByParsers[node.Name], field)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -411,7 +413,7 @@ cscli lapi context delete --value evt.Line.Src
|
||||||
for _, value := range valuesToDelete {
|
for _, value := range valuesToDelete {
|
||||||
valueFound := false
|
valueFound := false
|
||||||
for key, context := range csConfig.Crowdsec.ContextToSend {
|
for key, context := range csConfig.Crowdsec.ContextToSend {
|
||||||
if inSlice(value, context) {
|
if slices.Contains(context, value) {
|
||||||
valueFound = true
|
valueFound = true
|
||||||
csConfig.Crowdsec.ContextToSend[key] = removeFromSlice(value, context)
|
csConfig.Crowdsec.ContextToSend[key] = removeFromSlice(value, context)
|
||||||
log.Infof("value '%s' has been removed from key '%s'", value, key)
|
log.Infof("value '%s' has been removed from key '%s'", value, key)
|
||||||
|
@ -443,13 +445,13 @@ func detectStaticField(GrokStatics []types.ExtraField) []string {
|
||||||
for _, static := range GrokStatics {
|
for _, static := range GrokStatics {
|
||||||
if static.Parsed != "" {
|
if static.Parsed != "" {
|
||||||
fieldName := fmt.Sprintf("evt.Parsed.%s", static.Parsed)
|
fieldName := fmt.Sprintf("evt.Parsed.%s", static.Parsed)
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if static.Meta != "" {
|
if static.Meta != "" {
|
||||||
fieldName := fmt.Sprintf("evt.Meta.%s", static.Meta)
|
fieldName := fmt.Sprintf("evt.Meta.%s", static.Meta)
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -458,7 +460,7 @@ func detectStaticField(GrokStatics []types.ExtraField) []string {
|
||||||
if !strings.HasPrefix(fieldName, "evt.") {
|
if !strings.HasPrefix(fieldName, "evt.") {
|
||||||
fieldName = "evt." + fieldName
|
fieldName = "evt." + fieldName
|
||||||
}
|
}
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -472,7 +474,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
if node.Grok.RunTimeRegexp != nil {
|
if node.Grok.RunTimeRegexp != nil {
|
||||||
for _, capturedField := range node.Grok.RunTimeRegexp.Names() {
|
for _, capturedField := range node.Grok.RunTimeRegexp.Names() {
|
||||||
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -485,7 +487,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
}
|
}
|
||||||
for _, capturedField := range grokCompiled.Names() {
|
for _, capturedField := range grokCompiled.Names() {
|
||||||
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -494,7 +496,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
if len(node.Grok.Statics) > 0 {
|
if len(node.Grok.Statics) > 0 {
|
||||||
staticsField := detectStaticField(node.Grok.Statics)
|
staticsField := detectStaticField(node.Grok.Statics)
|
||||||
for _, staticField := range staticsField {
|
for _, staticField := range staticsField {
|
||||||
if !inSlice(staticField, ret) {
|
if !slices.Contains(ret, staticField) {
|
||||||
ret = append(ret, staticField)
|
ret = append(ret, staticField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -503,7 +505,7 @@ func detectNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
if len(node.Statics) > 0 {
|
if len(node.Statics) > 0 {
|
||||||
staticsField := detectStaticField(node.Statics)
|
staticsField := detectStaticField(node.Statics)
|
||||||
for _, staticField := range staticsField {
|
for _, staticField := range staticsField {
|
||||||
if !inSlice(staticField, ret) {
|
if !slices.Contains(ret, staticField) {
|
||||||
ret = append(ret, staticField)
|
ret = append(ret, staticField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -519,7 +521,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
if subnode.Grok.RunTimeRegexp != nil {
|
if subnode.Grok.RunTimeRegexp != nil {
|
||||||
for _, capturedField := range subnode.Grok.RunTimeRegexp.Names() {
|
for _, capturedField := range subnode.Grok.RunTimeRegexp.Names() {
|
||||||
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -531,7 +533,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
}
|
}
|
||||||
for _, capturedField := range grokCompiled.Names() {
|
for _, capturedField := range grokCompiled.Names() {
|
||||||
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
fieldName := fmt.Sprintf("evt.Parsed.%s", capturedField)
|
||||||
if !inSlice(fieldName, ret) {
|
if !slices.Contains(ret, fieldName) {
|
||||||
ret = append(ret, fieldName)
|
ret = append(ret, fieldName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -540,7 +542,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
if len(subnode.Grok.Statics) > 0 {
|
if len(subnode.Grok.Statics) > 0 {
|
||||||
staticsField := detectStaticField(subnode.Grok.Statics)
|
staticsField := detectStaticField(subnode.Grok.Statics)
|
||||||
for _, staticField := range staticsField {
|
for _, staticField := range staticsField {
|
||||||
if !inSlice(staticField, ret) {
|
if !slices.Contains(ret, staticField) {
|
||||||
ret = append(ret, staticField)
|
ret = append(ret, staticField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -549,7 +551,7 @@ func detectSubNode(node parser.Node, parserCTX parser.UnixParserCtx) []string {
|
||||||
if len(subnode.Statics) > 0 {
|
if len(subnode.Statics) > 0 {
|
||||||
staticsField := detectStaticField(subnode.Statics)
|
staticsField := detectStaticField(subnode.Statics)
|
||||||
for _, staticField := range staticsField {
|
for _, staticField := range staticsField {
|
||||||
if !inSlice(staticField, ret) {
|
if !slices.Contains(ret, staticField) {
|
||||||
ret = append(ret, staticField)
|
ret = append(ret, staticField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
"github.com/crowdsecurity/machineid"
|
"github.com/crowdsecurity/machineid"
|
||||||
|
@ -344,7 +345,7 @@ func NewMachinesDeleteCmd() *cobra.Command {
|
||||||
}
|
}
|
||||||
ret := make([]string, 0)
|
ret := make([]string, 0)
|
||||||
for _, machine := range machines {
|
for _, machine := range machines {
|
||||||
if strings.Contains(machine.MachineId, toComplete) && !inSlice(machine.MachineId, args) {
|
if strings.Contains(machine.MachineId, toComplete) && !slices.Contains(args, machine.MachineId) {
|
||||||
ret = append(ret, machine.MachineId)
|
ret = append(ret, machine.MachineId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/cobra/doc"
|
"github.com/spf13/cobra/doc"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
|
@ -36,6 +37,8 @@ var all bool
|
||||||
|
|
||||||
var prometheusURL string
|
var prometheusURL string
|
||||||
|
|
||||||
|
var mergedConfig string
|
||||||
|
|
||||||
func initConfig() {
|
func initConfig() {
|
||||||
var err error
|
var err error
|
||||||
if trace_lvl {
|
if trace_lvl {
|
||||||
|
@ -50,8 +53,8 @@ func initConfig() {
|
||||||
log.SetLevel(log.ErrorLevel)
|
log.SetLevel(log.ErrorLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !inSlice(os.Args[1], NoNeedConfig) {
|
if !slices.Contains(NoNeedConfig, os.Args[1]) {
|
||||||
csConfig, err = csconfig.NewConfig(ConfigFilePath, false, false, true)
|
csConfig, mergedConfig, err = csconfig.NewConfig(ConfigFilePath, false, false, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -17,12 +16,13 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FormatPrometheusMetrics is a complete rip from prom2json
|
// FormatPrometheusMetrics is a complete rip from prom2json
|
||||||
func FormatPrometheusMetrics(out io.Writer, url string, formatType string) error {
|
func FormatPrometheusMetrics(out io.Writer, url string, formatType string) error {
|
||||||
mfChan := make(chan *dto.MetricFamily, 1024)
|
mfChan := make(chan *dto.MetricFamily, 1024)
|
||||||
|
errChan := make(chan error, 1)
|
||||||
|
|
||||||
// Start with the DefaultTransport for sane defaults.
|
// Start with the DefaultTransport for sane defaults.
|
||||||
transport := http.DefaultTransport.(*http.Transport).Clone()
|
transport := http.DefaultTransport.(*http.Transport).Clone()
|
||||||
|
@ -32,17 +32,24 @@ func FormatPrometheusMetrics(out io.Writer, url string, formatType string) error
|
||||||
// Timeout early if the server doesn't even return the headers.
|
// Timeout early if the server doesn't even return the headers.
|
||||||
transport.ResponseHeaderTimeout = time.Minute
|
transport.ResponseHeaderTimeout = time.Minute
|
||||||
go func() {
|
go func() {
|
||||||
defer types.CatchPanic("crowdsec/ShowPrometheus")
|
defer trace.CatchPanic("crowdsec/ShowPrometheus")
|
||||||
err := prom2json.FetchMetricFamilies(url, mfChan, transport)
|
err := prom2json.FetchMetricFamilies(url, mfChan, transport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to fetch prometheus metrics : %v", err)
|
errChan <- fmt.Errorf("failed to fetch prometheus metrics: %w", err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
errChan <- nil
|
||||||
}()
|
}()
|
||||||
|
|
||||||
result := []*prom2json.Family{}
|
result := []*prom2json.Family{}
|
||||||
for mf := range mfChan {
|
for mf := range mfChan {
|
||||||
result = append(result, prom2json.NewFamily(mf))
|
result = append(result, prom2json.NewFamily(mf))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := <-errChan; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
log.Debugf("Finished reading prometheus output, %d entries", len(result))
|
log.Debugf("Finished reading prometheus output, %d entries", len(result))
|
||||||
/*walk*/
|
/*walk*/
|
||||||
lapi_decisions_stats := map[string]struct {
|
lapi_decisions_stats := map[string]struct {
|
||||||
|
@ -262,20 +269,18 @@ func FormatPrometheusMetrics(out io.Writer, url string, formatType string) error
|
||||||
|
|
||||||
var noUnit bool
|
var noUnit bool
|
||||||
|
|
||||||
func NewMetricsCmd() *cobra.Command {
|
|
||||||
var cmdMetrics = &cobra.Command{
|
func runMetrics(cmd *cobra.Command, args []string) error {
|
||||||
Use: "metrics",
|
|
||||||
Short: "Display crowdsec prometheus metrics.",
|
|
||||||
Long: `Fetch metrics from the prometheus server and display them in a human-friendly way`,
|
|
||||||
Args: cobra.ExactArgs(0),
|
|
||||||
DisableAutoGenTag: true,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
if err := csConfig.LoadPrometheus(); err != nil {
|
if err := csConfig.LoadPrometheus(); err != nil {
|
||||||
log.Fatal(err)
|
return fmt.Errorf("failed to load prometheus config: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if csConfig.Prometheus == nil {
|
||||||
|
return fmt.Errorf("prometheus section missing, can't show metrics")
|
||||||
|
}
|
||||||
|
|
||||||
if !csConfig.Prometheus.Enabled {
|
if !csConfig.Prometheus.Enabled {
|
||||||
log.Warning("Prometheus is not enabled, can't show metrics")
|
return fmt.Errorf("prometheus is not enabled, can't show metrics")
|
||||||
os.Exit(1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if prometheusURL == "" {
|
if prometheusURL == "" {
|
||||||
|
@ -283,15 +288,25 @@ func NewMetricsCmd() *cobra.Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
if prometheusURL == "" {
|
if prometheusURL == "" {
|
||||||
log.Errorf("No prometheus url, please specify in %s or via -u", *csConfig.FilePath)
|
return fmt.Errorf("no prometheus url, please specify in %s or via -u", *csConfig.FilePath)
|
||||||
os.Exit(1)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err := FormatPrometheusMetrics(color.Output, prometheusURL+"/metrics", csConfig.Cscli.Output)
|
err := FormatPrometheusMetrics(color.Output, prometheusURL+"/metrics", csConfig.Cscli.Output)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("could not fetch prometheus metrics: %s", err)
|
return fmt.Errorf("could not fetch prometheus metrics: %w", err)
|
||||||
}
|
}
|
||||||
},
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func NewMetricsCmd() *cobra.Command {
|
||||||
|
cmdMetrics := &cobra.Command{
|
||||||
|
Use: "metrics",
|
||||||
|
Short: "Display crowdsec prometheus metrics.",
|
||||||
|
Long: `Fetch metrics from the prometheus server and display them in a human-friendly way`,
|
||||||
|
Args: cobra.ExactArgs(0),
|
||||||
|
DisableAutoGenTag: true,
|
||||||
|
RunE: runMetrics,
|
||||||
}
|
}
|
||||||
cmdMetrics.PersistentFlags().StringVarP(&prometheusURL, "url", "u", "", "Prometheus url (http://<ip>:<port>/metrics)")
|
cmdMetrics.PersistentFlags().StringVarP(&prometheusURL, "url", "u", "", "Prometheus url (http://<ip>:<port>/metrics)")
|
||||||
cmdMetrics.PersistentFlags().BoolVar(&noUnit, "no-unit", false, "Show the real number instead of formatted with units")
|
cmdMetrics.PersistentFlags().BoolVar(&noUnit, "no-unit", false, "Show the real number instead of formatted with units")
|
||||||
|
|
|
@ -20,11 +20,12 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csplugin"
|
"github.com/crowdsecurity/crowdsec/pkg/csplugin"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csprofiles"
|
"github.com/crowdsecurity/crowdsec/pkg/csprofiles"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -273,7 +274,7 @@ cscli notifications reinject <alert_id> -a '{"remediation": true,"scenario":"not
|
||||||
client, err := apiclient.NewClient(&apiclient.Config{
|
client, err := apiclient.NewClient(&apiclient.Config{
|
||||||
MachineID: csConfig.API.Client.Credentials.Login,
|
MachineID: csConfig.API.Client.Credentials.Login,
|
||||||
Password: strfmt.Password(csConfig.API.Client.Credentials.Password),
|
Password: strfmt.Password(csConfig.API.Client.Credentials.Password),
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiserver"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/crowdsec/pkg/apiserver"
|
||||||
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewPapiCmd() *cobra.Command {
|
func NewPapiCmd() *cobra.Command {
|
||||||
|
@ -20,7 +22,7 @@ func NewPapiCmd() *cobra.Command {
|
||||||
DisableAutoGenTag: true,
|
DisableAutoGenTag: true,
|
||||||
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
if err := csConfig.LoadAPIServer(); err != nil || csConfig.DisableAPI {
|
if err := csConfig.LoadAPIServer(); err != nil || csConfig.DisableAPI {
|
||||||
return errors.Wrap(err, "Local API is disabled, please run this command on the local API machine")
|
return fmt.Errorf("Local API is disabled, please run this command on the local API machine: %w", err)
|
||||||
}
|
}
|
||||||
if csConfig.API.Server.OnlineClient == nil {
|
if csConfig.API.Server.OnlineClient == nil {
|
||||||
log.Fatalf("no configuration for Central API in '%s'", *csConfig.FilePath)
|
log.Fatalf("no configuration for Central API in '%s'", *csConfig.FilePath)
|
||||||
|
@ -71,7 +73,7 @@ func NewPapiStatusCmd() *cobra.Command {
|
||||||
var lastTimestampStr *string
|
var lastTimestampStr *string
|
||||||
lastTimestampStr, err = dbClient.GetConfigItem(apiserver.PapiPullKey)
|
lastTimestampStr, err = dbClient.GetConfigItem(apiserver.PapiPullKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
lastTimestampStr = types.StrPtr("never")
|
lastTimestampStr = ptr.Of("never")
|
||||||
}
|
}
|
||||||
log.Infof("You can successfully interact with Polling API (PAPI)")
|
log.Infof("You can successfully interact with Polling API (PAPI)")
|
||||||
log.Infof("Console plan: %s", perms.Plan)
|
log.Infof("Console plan: %s", perms.Plan)
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
|
@ -161,7 +162,7 @@ func NewSimulationEnableCmd() *cobra.Command {
|
||||||
if !item.Installed {
|
if !item.Installed {
|
||||||
log.Warningf("'%s' isn't enabled", scenario)
|
log.Warningf("'%s' isn't enabled", scenario)
|
||||||
}
|
}
|
||||||
isExcluded := inSlice(scenario, csConfig.Cscli.SimulationConfig.Exclusions)
|
isExcluded := slices.Contains(csConfig.Cscli.SimulationConfig.Exclusions, scenario)
|
||||||
if *csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
|
if *csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
|
||||||
log.Warning("global simulation is already enabled")
|
log.Warning("global simulation is already enabled")
|
||||||
continue
|
continue
|
||||||
|
@ -210,7 +211,7 @@ func NewSimulationDisableCmd() *cobra.Command {
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
for _, scenario := range args {
|
for _, scenario := range args {
|
||||||
isExcluded := inSlice(scenario, csConfig.Cscli.SimulationConfig.Exclusions)
|
isExcluded := slices.Contains(csConfig.Cscli.SimulationConfig.Exclusions, scenario)
|
||||||
if !*csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
|
if !*csConfig.Cscli.SimulationConfig.Simulation && !isExcluded {
|
||||||
log.Warningf("%s isn't in simulation mode", scenario)
|
log.Warningf("%s isn't in simulation mode", scenario)
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -18,6 +18,8 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
||||||
|
@ -182,7 +184,7 @@ func collectAPIStatus(login string, password string, endpoint string, prefix str
|
||||||
|
|
||||||
Client, err = apiclient.NewDefaultClient(apiurl,
|
Client, err = apiclient.NewDefaultClient(apiurl,
|
||||||
prefix,
|
prefix,
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil)
|
nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []byte(fmt.Sprintf("could not init client: %s", err))
|
return []byte(fmt.Sprintf("could not init client: %s", err))
|
||||||
|
|
|
@ -19,8 +19,11 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/texttheater/golang-levenshtein/levenshtein"
|
"github.com/texttheater/golang-levenshtein/levenshtein"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
|
@ -35,15 +38,6 @@ func printHelp(cmd *cobra.Command) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func inSlice(s string, slice []string) bool {
|
|
||||||
for _, str := range slice {
|
|
||||||
if s == str {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
func indexOf(s string, slice []string) int {
|
func indexOf(s string, slice []string) int {
|
||||||
for i, elem := range slice {
|
for i, elem := range slice {
|
||||||
if s == elem {
|
if s == elem {
|
||||||
|
@ -113,7 +107,7 @@ func compAllItems(itemType string, args []string, toComplete string) ([]string,
|
||||||
comp := make([]string, 0)
|
comp := make([]string, 0)
|
||||||
hubItems := cwhub.GetHubStatusForItemType(itemType, "", true)
|
hubItems := cwhub.GetHubStatusForItemType(itemType, "", true)
|
||||||
for _, item := range hubItems {
|
for _, item := range hubItems {
|
||||||
if !inSlice(item.Name, args) && strings.Contains(item.Name, toComplete) {
|
if !slices.Contains(args, item.Name) && strings.Contains(item.Name, toComplete) {
|
||||||
comp = append(comp, item.Name)
|
comp = append(comp, item.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -515,7 +509,7 @@ func GetPrometheusMetric(url string) []*prom2json.Family {
|
||||||
transport.ResponseHeaderTimeout = time.Minute
|
transport.ResponseHeaderTimeout = time.Minute
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer types.CatchPanic("crowdsec/GetPrometheusMetric")
|
defer trace.CatchPanic("crowdsec/GetPrometheusMetric")
|
||||||
err := prom2json.FetchMetricFamilies(url, mfChan, transport)
|
err := prom2json.FetchMetricFamilies(url, mfChan, transport)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed to fetch prometheus metrics : %v", err)
|
log.Fatalf("failed to fetch prometheus metrics : %v", err)
|
||||||
|
@ -691,30 +685,13 @@ type unit struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
var ranges = []unit{
|
var ranges = []unit{
|
||||||
{
|
{value: 1e18, symbol: "E"},
|
||||||
value: 1e18,
|
{value: 1e15, symbol: "P"},
|
||||||
symbol: "E",
|
{value: 1e12, symbol: "T"},
|
||||||
},
|
{value: 1e9, symbol: "G"},
|
||||||
{
|
{value: 1e6, symbol: "M"},
|
||||||
value: 1e15,
|
{value: 1e3, symbol: "k"},
|
||||||
symbol: "P",
|
{value: 1, symbol: ""},
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 1e12,
|
|
||||||
symbol: "T",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 1e6,
|
|
||||||
symbol: "M",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 1e3,
|
|
||||||
symbol: "k",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 1,
|
|
||||||
symbol: "",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatNumber(num int) string {
|
func formatNumber(num int) string {
|
||||||
|
@ -746,7 +723,6 @@ func getDBClient() (*database.Client, error) {
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func removeFromSlice(val string, slice []string) []string {
|
func removeFromSlice(val string, slice []string) []string {
|
||||||
var i int
|
var i int
|
||||||
var value string
|
var value string
|
||||||
|
|
|
@ -7,9 +7,7 @@ endif
|
||||||
# Go parameters
|
# Go parameters
|
||||||
GOCMD = go
|
GOCMD = go
|
||||||
GOBUILD = $(GOCMD) build
|
GOBUILD = $(GOCMD) build
|
||||||
GOCLEAN = $(GOCMD) clean
|
|
||||||
GOTEST = $(GOCMD) test
|
GOTEST = $(GOCMD) test
|
||||||
GOGET = $(GOCMD) get
|
|
||||||
|
|
||||||
CROWDSEC_BIN = crowdsec$(EXT)
|
CROWDSEC_BIN = crowdsec$(EXT)
|
||||||
# names longer than 15 chars break 'pgrep'
|
# names longer than 15 chars break 'pgrep'
|
||||||
|
@ -31,7 +29,7 @@ test:
|
||||||
$(GOTEST) $(LD_OPTS) -v ./...
|
$(GOTEST) $(LD_OPTS) -v ./...
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
@$(RM) $(CROWDSEC_BIN) $(CROWDSEC_BIN).test $(WIN_IGNORE_ERR)
|
@$(RM) $(CROWDSEC_BIN) $(WIN_IGNORE_ERR)
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install: install-conf install-bin
|
install: install-conf install-bin
|
||||||
|
@ -59,7 +57,7 @@ install-conf:
|
||||||
install-bin:
|
install-bin:
|
||||||
install -v -m 755 -D "$(CROWDSEC_BIN)" "$(BIN_PREFIX)/$(CROWDSEC_BIN)" || exit
|
install -v -m 755 -D "$(CROWDSEC_BIN)" "$(BIN_PREFIX)/$(CROWDSEC_BIN)" || exit
|
||||||
|
|
||||||
.PHONY: systemd"$(BIN_PREFI"$(BIN_PREFIX)/$(CROWDSEC_BIN)""$(BIN_PREFIX)/$(CROWDSEC_BIN)"X)/$(CROWDSEC_BIN)"
|
.PHONY: systemd
|
||||||
systemd: install
|
systemd: install
|
||||||
CFG=$(CFG_PREFIX) PID=$(PID_DIR) BIN=$(BIN_PREFIX)"/"$(CROWDSEC_BIN) envsubst < ../../config/crowdsec.service > "$(SYSTEMD_PATH_FILE)"
|
CFG=$(CFG_PREFIX) PID=$(PID_DIR) BIN=$(BIN_PREFIX)"/"$(CROWDSEC_BIN) envsubst < ../../config/crowdsec.service > "$(SYSTEMD_PATH_FILE)"
|
||||||
systemctl daemon-reload
|
systemctl daemon-reload
|
||||||
|
|
|
@ -7,9 +7,10 @@ import (
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiserver"
|
"github.com/crowdsecurity/crowdsec/pkg/apiserver"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func initAPIServer(cConfig *csconfig.Config) (*apiserver.APIServer, error) {
|
func initAPIServer(cConfig *csconfig.Config) (*apiserver.APIServer, error) {
|
||||||
|
@ -52,9 +53,9 @@ func initAPIServer(cConfig *csconfig.Config) (*apiserver.APIServer, error) {
|
||||||
|
|
||||||
func serveAPIServer(apiServer *apiserver.APIServer, apiReady chan bool) {
|
func serveAPIServer(apiServer *apiserver.APIServer, apiReady chan bool) {
|
||||||
apiTomb.Go(func() error {
|
apiTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/serveAPIServer")
|
defer trace.CatchPanic("crowdsec/serveAPIServer")
|
||||||
go func() {
|
go func() {
|
||||||
defer types.CatchPanic("crowdsec/runAPIServer")
|
defer trace.CatchPanic("crowdsec/runAPIServer")
|
||||||
log.Debugf("serving API after %s ms", time.Since(crowdsecT0))
|
log.Debugf("serving API after %s ms", time.Since(crowdsecT0))
|
||||||
if err := apiServer.Run(apiReady); err != nil {
|
if err := apiServer.Run(apiReady); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
|
|
|
@ -8,6 +8,8 @@ import (
|
||||||
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
|
@ -53,7 +55,7 @@ func runCrowdsec(cConfig *csconfig.Config, parsers *parser.Parsers) error {
|
||||||
parserWg.Add(1)
|
parserWg.Add(1)
|
||||||
for i := 0; i < cConfig.Crowdsec.ParserRoutinesCount; i++ {
|
for i := 0; i < cConfig.Crowdsec.ParserRoutinesCount; i++ {
|
||||||
parsersTomb.Go(func() error {
|
parsersTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/runParse")
|
defer trace.CatchPanic("crowdsec/runParse")
|
||||||
if err := runParse(inputLineChan, inputEventChan, *parsers.Ctx, parsers.Nodes); err != nil { //this error will never happen as parser.Parse is not able to return errors
|
if err := runParse(inputLineChan, inputEventChan, *parsers.Ctx, parsers.Nodes); err != nil { //this error will never happen as parser.Parse is not able to return errors
|
||||||
log.Fatalf("starting parse error : %s", err)
|
log.Fatalf("starting parse error : %s", err)
|
||||||
return err
|
return err
|
||||||
|
@ -79,7 +81,7 @@ func runCrowdsec(cConfig *csconfig.Config, parsers *parser.Parsers) error {
|
||||||
|
|
||||||
for i := 0; i < cConfig.Crowdsec.BucketsRoutinesCount; i++ {
|
for i := 0; i < cConfig.Crowdsec.BucketsRoutinesCount; i++ {
|
||||||
bucketsTomb.Go(func() error {
|
bucketsTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/runPour")
|
defer trace.CatchPanic("crowdsec/runPour")
|
||||||
if err := runPour(inputEventChan, holders, buckets, cConfig); err != nil {
|
if err := runPour(inputEventChan, holders, buckets, cConfig); err != nil {
|
||||||
log.Fatalf("starting pour error : %s", err)
|
log.Fatalf("starting pour error : %s", err)
|
||||||
return err
|
return err
|
||||||
|
@ -97,7 +99,7 @@ func runCrowdsec(cConfig *csconfig.Config, parsers *parser.Parsers) error {
|
||||||
outputWg.Add(1)
|
outputWg.Add(1)
|
||||||
for i := 0; i < cConfig.Crowdsec.OutputRoutinesCount; i++ {
|
for i := 0; i < cConfig.Crowdsec.OutputRoutinesCount; i++ {
|
||||||
outputsTomb.Go(func() error {
|
outputsTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/runOutput")
|
defer trace.CatchPanic("crowdsec/runOutput")
|
||||||
if err := runOutput(inputEventChan, outputEventChan, buckets, *parsers.Povfwctx, parsers.Povfwnodes, *cConfig.API.Client.Credentials); err != nil {
|
if err := runOutput(inputEventChan, outputEventChan, buckets, *parsers.Povfwctx, parsers.Povfwnodes, *cConfig.API.Client.Credentials); err != nil {
|
||||||
log.Fatalf("starting outputs error : %s", err)
|
log.Fatalf("starting outputs error : %s", err)
|
||||||
return err
|
return err
|
||||||
|
@ -132,9 +134,9 @@ func runCrowdsec(cConfig *csconfig.Config, parsers *parser.Parsers) error {
|
||||||
|
|
||||||
func serveCrowdsec(parsers *parser.Parsers, cConfig *csconfig.Config, agentReady chan bool) {
|
func serveCrowdsec(parsers *parser.Parsers, cConfig *csconfig.Config, agentReady chan bool) {
|
||||||
crowdsecTomb.Go(func() error {
|
crowdsecTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/serveCrowdsec")
|
defer trace.CatchPanic("crowdsec/serveCrowdsec")
|
||||||
go func() {
|
go func() {
|
||||||
defer types.CatchPanic("crowdsec/runCrowdsec")
|
defer trace.CatchPanic("crowdsec/runCrowdsec")
|
||||||
// this logs every time, even at config reload
|
// this logs every time, even at config reload
|
||||||
log.Debugf("running agent after %s ms", time.Since(crowdsecT0))
|
log.Debugf("running agent after %s ms", time.Since(crowdsecT0))
|
||||||
agentReady <- true
|
agentReady <- true
|
||||||
|
|
|
@ -154,7 +154,9 @@ func (f *Flags) Parse() {
|
||||||
flag.BoolVar(&f.DisableAgent, "no-cs", false, "disable crowdsec agent")
|
flag.BoolVar(&f.DisableAgent, "no-cs", false, "disable crowdsec agent")
|
||||||
flag.BoolVar(&f.DisableAPI, "no-api", false, "disable local API")
|
flag.BoolVar(&f.DisableAPI, "no-api", false, "disable local API")
|
||||||
flag.BoolVar(&f.DisableCAPI, "no-capi", false, "disable communication with Central API")
|
flag.BoolVar(&f.DisableCAPI, "no-capi", false, "disable communication with Central API")
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
flag.StringVar(&f.WinSvc, "winsvc", "", "Windows service Action: Install, Remove etc..")
|
flag.StringVar(&f.WinSvc, "winsvc", "", "Windows service Action: Install, Remove etc..")
|
||||||
|
}
|
||||||
flag.StringVar(&dumpFolder, "dump-data", "", "dump parsers/buckets raw outputs")
|
flag.StringVar(&dumpFolder, "dump-data", "", "dump parsers/buckets raw outputs")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
}
|
}
|
||||||
|
@ -192,7 +194,7 @@ func newLogLevel(curLevelPtr *log.Level, f *Flags) *log.Level {
|
||||||
|
|
||||||
// LoadConfig returns a configuration parsed from configuration file
|
// LoadConfig returns a configuration parsed from configuration file
|
||||||
func LoadConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool) (*csconfig.Config, error) {
|
func LoadConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool) (*csconfig.Config, error) {
|
||||||
cConfig, err := csconfig.NewConfig(configFile, disableAgent, disableAPI, quiet)
|
cConfig, _, err := csconfig.NewConfig(configFile, disableAgent, disableAPI, quiet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,15 +9,16 @@ import (
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
v1 "github.com/crowdsecurity/crowdsec/pkg/apiserver/controllers/v1"
|
v1 "github.com/crowdsecurity/crowdsec/pkg/apiserver/controllers/v1"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cache"
|
"github.com/crowdsecurity/crowdsec/pkg/cache"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
||||||
leaky "github.com/crowdsecurity/crowdsec/pkg/leakybucket"
|
leaky "github.com/crowdsecurity/crowdsec/pkg/leakybucket"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/parser"
|
"github.com/crowdsecurity/crowdsec/pkg/parser"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
/*prometheus*/
|
/*prometheus*/
|
||||||
|
@ -61,7 +62,7 @@ var globalCsInfo = prometheus.NewGauge(
|
||||||
prometheus.GaugeOpts{
|
prometheus.GaugeOpts{
|
||||||
Name: "cs_info",
|
Name: "cs_info",
|
||||||
Help: "Information about Crowdsec.",
|
Help: "Information about Crowdsec.",
|
||||||
ConstLabels: prometheus.Labels{"version": cwversion.VersionStr()},
|
ConstLabels: prometheus.Labels{"version": version.String()},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -187,7 +188,7 @@ func servePrometheus(config *csconfig.PrometheusCfg, dbClient *database.Client,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer types.CatchPanic("crowdsec/servePrometheus")
|
defer trace.CatchPanic("crowdsec/servePrometheus")
|
||||||
|
|
||||||
http.Handle("/metrics", computeDynamicMetrics(promhttp.Handler(), dbClient))
|
http.Handle("/metrics", computeDynamicMetrics(promhttp.Handler(), dbClient))
|
||||||
<-apiReady
|
<-apiReady
|
||||||
|
|
|
@ -7,10 +7,11 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
"github.com/crowdsecurity/crowdsec/pkg/cwhub"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
leaky "github.com/crowdsecurity/crowdsec/pkg/leakybucket"
|
leaky "github.com/crowdsecurity/crowdsec/pkg/leakybucket"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/parser"
|
"github.com/crowdsecurity/crowdsec/pkg/parser"
|
||||||
|
@ -88,7 +89,7 @@ func runOutput(input chan types.Event, overflow chan types.Event, buckets *leaky
|
||||||
MachineID: apiConfig.Login,
|
MachineID: apiConfig.Login,
|
||||||
Password: password,
|
Password: password,
|
||||||
Scenarios: scenarios,
|
Scenarios: scenarios,
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
PapiURL: papiURL,
|
PapiURL: papiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
|
|
|
@ -10,10 +10,11 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/sirupsen/logrus/hooks/writer"
|
"github.com/sirupsen/logrus/hooks/writer"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func StartRunSvc() error {
|
func StartRunSvc() error {
|
||||||
|
@ -22,7 +23,7 @@ func StartRunSvc() error {
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
defer types.CatchPanic("crowdsec/StartRunSvc")
|
defer trace.CatchPanic("crowdsec/StartRunSvc")
|
||||||
|
|
||||||
// Set a default logger with level=fatal on stderr,
|
// Set a default logger with level=fatal on stderr,
|
||||||
// in addition to the one we configure afterwards
|
// in addition to the one we configure afterwards
|
||||||
|
@ -38,7 +39,7 @@ func StartRunSvc() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Crowdsec %s", cwversion.VersionStr())
|
log.Infof("Crowdsec %s", version.String())
|
||||||
|
|
||||||
apiReady := make(chan bool, 1)
|
apiReady := make(chan bool, 1)
|
||||||
agentReady := make(chan bool, 1)
|
agentReady := make(chan bool, 1)
|
||||||
|
|
|
@ -7,17 +7,18 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"golang.org/x/sys/windows/svc"
|
"golang.org/x/sys/windows/svc"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func StartRunSvc() error {
|
func StartRunSvc() error {
|
||||||
const svcName = "CrowdSec"
|
const svcName = "CrowdSec"
|
||||||
const svcDescription = "Crowdsec IPS/IDS"
|
const svcDescription = "Crowdsec IPS/IDS"
|
||||||
|
|
||||||
defer types.CatchPanic("crowdsec/StartRunSvc")
|
defer trace.CatchPanic("crowdsec/StartRunSvc")
|
||||||
|
|
||||||
isRunninginService, err := svc.IsWindowsService()
|
isRunninginService, err := svc.IsWindowsService()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -66,7 +67,7 @@ func WindowsRun() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Configure logging
|
// Configure logging
|
||||||
log.Infof("Crowdsec %s", cwversion.VersionStr())
|
log.Infof("Crowdsec %s", version.String())
|
||||||
|
|
||||||
apiReady := make(chan bool, 1)
|
apiReady := make(chan bool, 1)
|
||||||
agentReady := make(chan bool, 1)
|
agentReady := make(chan bool, 1)
|
||||||
|
|
|
@ -11,6 +11,8 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
||||||
|
@ -226,7 +228,7 @@ func HandleSignals(cConfig *csconfig.Config) error {
|
||||||
exitChan := make(chan error)
|
exitChan := make(chan error)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
defer types.CatchPanic("crowdsec/HandleSignals")
|
defer trace.CatchPanic("crowdsec/HandleSignals")
|
||||||
Loop:
|
Loop:
|
||||||
for {
|
for {
|
||||||
s := <-signalChan
|
s := <-signalChan
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
##RDP
|
||||||
source: wineventlog
|
source: wineventlog
|
||||||
event_channel: Security
|
event_channel: Security
|
||||||
event_ids:
|
event_ids:
|
||||||
|
@ -6,3 +7,25 @@ event_ids:
|
||||||
event_level: information
|
event_level: information
|
||||||
labels:
|
labels:
|
||||||
type: eventlog
|
type: eventlog
|
||||||
|
---
|
||||||
|
##Firewall
|
||||||
|
filenames:
|
||||||
|
- C:\Windows\System32\LogFiles\Firewall\pfirewall.log
|
||||||
|
labels:
|
||||||
|
type: windows-firewall
|
||||||
|
---
|
||||||
|
##SQL Server
|
||||||
|
source: wineventlog
|
||||||
|
event_channel: Application
|
||||||
|
event_ids:
|
||||||
|
- 18456
|
||||||
|
event_level: information
|
||||||
|
labels:
|
||||||
|
type: eventlog
|
||||||
|
---
|
||||||
|
##IIS
|
||||||
|
use_time_machine: true
|
||||||
|
filenames:
|
||||||
|
- C:\inetpub\logs\LogFiles\*\*.log
|
||||||
|
labels:
|
||||||
|
type: iis
|
|
@ -1,4 +1,3 @@
|
||||||
simulation: off
|
simulation: false
|
||||||
# exclusions:
|
# exclusions:
|
||||||
# - crowdsecurity/ssh-bf
|
# - crowdsecurity/ssh-bf
|
||||||
|
|
6
debian/rules
vendored
6
debian/rules
vendored
|
@ -4,12 +4,6 @@ export DEB_VERSION=$(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d
|
||||||
export BUILD_VERSION=v${DEB_VERSION}-debian-pragmatic
|
export BUILD_VERSION=v${DEB_VERSION}-debian-pragmatic
|
||||||
export GO111MODULE=on
|
export GO111MODULE=on
|
||||||
|
|
||||||
# LD_OPTS=-ldflags "-s -w -X github.com/crowdsecurity/crowdsec/pkg/cwversion.Version=$(BUILD_VERSION) \
|
|
||||||
# -X github.com/crowdsecurity/crowdsec/pkg/cwversion.BuildDate=$(BUILD_TIMESTAMP) \
|
|
||||||
# -X github.com/crowdsecurity/crowdsec/pkg/cwversion.Codename=$(BUILD_CODENAME) \
|
|
||||||
# -X github.com/crowdsecurity/crowdsec/pkg/cwversion.Tag=$(BUILD_TAG) \
|
|
||||||
# -X github.com/crowdsecurity/crowdsec/pkg/cwversion.GoVersion=$(BUILD_GOVERSION)"
|
|
||||||
|
|
||||||
%:
|
%:
|
||||||
dh $@
|
dh $@
|
||||||
|
|
||||||
|
|
|
@ -280,6 +280,7 @@ config.yaml) each time the container is run.
|
||||||
| __LAPI__ | | (useless with DISABLE_LOCAL_API) |
|
| __LAPI__ | | (useless with DISABLE_LOCAL_API) |
|
||||||
| `USE_WAL` | false | Enable Write-Ahead Logging with SQLite |
|
| `USE_WAL` | false | Enable Write-Ahead Logging with SQLite |
|
||||||
| `CUSTOM_HOSTNAME` | localhost | Name for the local agent (running in the container with LAPI) |
|
| `CUSTOM_HOSTNAME` | localhost | Name for the local agent (running in the container with LAPI) |
|
||||||
|
| `CAPI_WHITELISTS_PATH` | | Path for capi_whitelists.yaml |
|
||||||
| | | |
|
| | | |
|
||||||
| __Agent__ | | (these don't work with DISABLE_AGENT) |
|
| __Agent__ | | (these don't work with DISABLE_AGENT) |
|
||||||
| `TYPE` | | [`Labels.type`](https://docs.crowdsec.net/Crowdsec/v1/references/acquisition/) for file in time-machine: `-e TYPE="<type>"` |
|
| `TYPE` | | [`Labels.type`](https://docs.crowdsec.net/Crowdsec/v1/references/acquisition/) for file in time-machine: `-e TYPE="<type>"` |
|
||||||
|
|
|
@ -187,7 +187,6 @@ fi
|
||||||
|
|
||||||
lapi_credentials_path=$(conf_get '.api.client.credentials_path')
|
lapi_credentials_path=$(conf_get '.api.client.credentials_path')
|
||||||
|
|
||||||
|
|
||||||
if isfalse "$DISABLE_LOCAL_API"; then
|
if isfalse "$DISABLE_LOCAL_API"; then
|
||||||
# generate local agent credentials (even if agent is disabled, cscli needs a
|
# generate local agent credentials (even if agent is disabled, cscli needs a
|
||||||
# connection to the API)
|
# connection to the API)
|
||||||
|
@ -365,6 +364,11 @@ for BOUNCER in /run/secrets/@(bouncer_key|BOUNCER_KEY)* ; do
|
||||||
done
|
done
|
||||||
shopt -u nullglob extglob
|
shopt -u nullglob extglob
|
||||||
|
|
||||||
|
# set all options before validating the configuration
|
||||||
|
|
||||||
|
conf_set_if "$CAPI_WHITELISTS_PATH" '.api.server.capi_whitelists_path = strenv(CAPI_WHITELISTS_PATH)'
|
||||||
|
conf_set_if "$METRICS_PORT" '.prometheus.listen_port=env(METRICS_PORT)'
|
||||||
|
|
||||||
ARGS=""
|
ARGS=""
|
||||||
if [ "$CONFIG_FILE" != "" ]; then
|
if [ "$CONFIG_FILE" != "" ]; then
|
||||||
ARGS="-c $CONFIG_FILE"
|
ARGS="-c $CONFIG_FILE"
|
||||||
|
@ -402,7 +406,5 @@ if istrue "$LEVEL_INFO"; then
|
||||||
ARGS="$ARGS -info"
|
ARGS="$ARGS -info"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
conf_set_if "$METRICS_PORT" '.prometheus.listen_port=env(METRICS_PORT)'
|
|
||||||
|
|
||||||
# shellcheck disable=SC2086
|
# shellcheck disable=SC2086
|
||||||
exec crowdsec $ARGS
|
exec crowdsec $ARGS
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
[packages]
|
[packages]
|
||||||
pytest-dotenv = "*"
|
pytest-dotenv = "*"
|
||||||
pytest-xdist = "*"
|
pytest-xdist = "*"
|
||||||
pytest-cs = {ref = "0.4.0", git = "https://github.com/crowdsecurity/pytest-cs.git"}
|
pytest-cs = {ref = "0.7.16", git = "https://github.com/crowdsecurity/pytest-cs.git"}
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
gnureadline = "*"
|
gnureadline = "*"
|
||||||
ipdb = "*"
|
ipdb = "*"
|
||||||
|
|
||||||
[requires]
|
[requires]
|
||||||
python_version = "3.10"
|
python_version = "*"
|
||||||
|
|
189
docker/test/Pipfile.lock
generated
189
docker/test/Pipfile.lock
generated
|
@ -1,11 +1,11 @@
|
||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "da2959f993eb751a5f6d2b1c4537ba39ed414d0e9d300dc513ced5a8f0ab4261"
|
"sha256": "7e91f125d4ad0d1f1b5da7ef441d75baf4f28788c791803a216cb6956b131ea9"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {
|
"requires": {
|
||||||
"python_version": "3.10"
|
"python_version": "*"
|
||||||
},
|
},
|
||||||
"sources": [
|
"sources": [
|
||||||
{
|
{
|
||||||
|
@ -16,21 +16,13 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"default": {
|
"default": {
|
||||||
"attrs": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836",
|
|
||||||
"sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"
|
|
||||||
],
|
|
||||||
"markers": "python_version >= '3.6'",
|
|
||||||
"version": "==22.2.0"
|
|
||||||
},
|
|
||||||
"certifi": {
|
"certifi": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3",
|
"sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7",
|
||||||
"sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"
|
"sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==2022.12.7"
|
"version": "==2023.5.7"
|
||||||
},
|
},
|
||||||
"cffi": {
|
"cffi": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -184,48 +176,36 @@
|
||||||
},
|
},
|
||||||
"cryptography": {
|
"cryptography": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:103e8f7155f3ce2ffa0049fe60169878d47a4364b277906386f8de21c9234aa1",
|
"sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440",
|
||||||
"sha256:23df8ca3f24699167daf3e23e51f7ba7334d504af63a94af468f468b975b7dd7",
|
"sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288",
|
||||||
"sha256:2725672bb53bb92dc7b4150d233cd4b8c59615cd8288d495eaa86db00d4e5c06",
|
"sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b",
|
||||||
"sha256:30b1d1bfd00f6fc80d11300a29f1d8ab2b8d9febb6ed4a38a76880ec564fae84",
|
"sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958",
|
||||||
"sha256:35d658536b0a4117c885728d1a7032bdc9a5974722ae298d6c533755a6ee3915",
|
"sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b",
|
||||||
"sha256:50cadb9b2f961757e712a9737ef33d89b8190c3ea34d0fb6675e00edbe35d074",
|
"sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d",
|
||||||
"sha256:5f8c682e736513db7d04349b4f6693690170f95aac449c56f97415c6980edef5",
|
"sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a",
|
||||||
"sha256:6236a9610c912b129610eb1a274bdc1350b5df834d124fa84729ebeaf7da42c3",
|
"sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404",
|
||||||
"sha256:788b3921d763ee35dfdb04248d0e3de11e3ca8eb22e2e48fef880c42e1f3c8f9",
|
"sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b",
|
||||||
"sha256:8bc0008ef798231fac03fe7d26e82d601d15bd16f3afaad1c6113771566570f3",
|
"sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e",
|
||||||
"sha256:8f35c17bd4faed2bc7797d2a66cbb4f986242ce2e30340ab832e5d99ae60e011",
|
"sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2",
|
||||||
"sha256:b49a88ff802e1993b7f749b1eeb31134f03c8d5c956e3c125c75558955cda536",
|
"sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c",
|
||||||
"sha256:bc0521cce2c1d541634b19f3ac661d7a64f9555135e9d8af3980965be717fd4a",
|
"sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b",
|
||||||
"sha256:bc5b871e977c8ee5a1bbc42fa8d19bcc08baf0c51cbf1586b0e87a2694dde42f",
|
"sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9",
|
||||||
"sha256:c43ac224aabcbf83a947eeb8b17eaf1547bce3767ee2d70093b461f31729a480",
|
"sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b",
|
||||||
"sha256:d15809e0dbdad486f4ad0979753518f47980020b7a34e9fc56e8be4f60702fac",
|
"sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636",
|
||||||
"sha256:d7d84a512a59f4412ca8549b01f94be4161c94efc598bf09d027d67826beddc0",
|
"sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99",
|
||||||
"sha256:e029b844c21116564b8b61216befabca4b500e6816fa9f0ba49527653cae2108",
|
"sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e",
|
||||||
"sha256:e8a0772016feeb106efd28d4a328e77dc2edae84dfbac06061319fdb669ff828",
|
"sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"
|
||||||
"sha256:e944fe07b6f229f4c1a06a7ef906a19652bdd9fd54c761b0ff87e83ae7a30354",
|
|
||||||
"sha256:eb40fe69cfc6f5cdab9a5ebd022131ba21453cf7b8a7fd3631f45bbf52bed612",
|
|
||||||
"sha256:fa507318e427169ade4e9eccef39e9011cdc19534f55ca2f36ec3f388c1f70f3",
|
|
||||||
"sha256:ffd394c7896ed7821a6d13b24657c6a34b6e2650bd84ae063cf11ccffa4f1a97"
|
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==39.0.2"
|
"version": "==40.0.2"
|
||||||
},
|
},
|
||||||
"docker": {
|
"docker": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:896c4282e5c7af5c45e8b683b0b0c33932974fe6e50fc6906a0a83616ab3da97",
|
"sha256:134cd828f84543cbf8e594ff81ca90c38288df3c0a559794c12f2e4b634ea19e",
|
||||||
"sha256:dbcb3bd2fa80dca0788ed908218bf43972772009b881ed1e20dfc29a65e49782"
|
"sha256:dcc088adc2ec4e7cfc594e275d8bd2c9738c56c808de97476939ef67db5af8c2"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==6.0.1"
|
"version": "==6.1.2"
|
||||||
},
|
|
||||||
"exceptiongroup": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e",
|
|
||||||
"sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"
|
|
||||||
],
|
|
||||||
"markers": "python_version < '3.11'",
|
|
||||||
"version": "==1.1.1"
|
|
||||||
},
|
},
|
||||||
"execnet": {
|
"execnet": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -253,11 +233,11 @@
|
||||||
},
|
},
|
||||||
"packaging": {
|
"packaging": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2",
|
"sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61",
|
||||||
"sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"
|
"sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==23.0"
|
"version": "==23.1"
|
||||||
},
|
},
|
||||||
"pluggy": {
|
"pluggy": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -269,23 +249,23 @@
|
||||||
},
|
},
|
||||||
"psutil": {
|
"psutil": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff",
|
"sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d",
|
||||||
"sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1",
|
"sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217",
|
||||||
"sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62",
|
"sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4",
|
||||||
"sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549",
|
"sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c",
|
||||||
"sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08",
|
"sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f",
|
||||||
"sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7",
|
"sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da",
|
||||||
"sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e",
|
"sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4",
|
||||||
"sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe",
|
"sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42",
|
||||||
"sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24",
|
"sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5",
|
||||||
"sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad",
|
"sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4",
|
||||||
"sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94",
|
"sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9",
|
||||||
"sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8",
|
"sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f",
|
||||||
"sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7",
|
"sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30",
|
||||||
"sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"
|
"sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||||
"version": "==5.9.4"
|
"version": "==5.9.5"
|
||||||
},
|
},
|
||||||
"pycparser": {
|
"pycparser": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -296,15 +276,15 @@
|
||||||
},
|
},
|
||||||
"pytest": {
|
"pytest": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e",
|
"sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362",
|
||||||
"sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"
|
"sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==7.2.2"
|
"version": "==7.3.1"
|
||||||
},
|
},
|
||||||
"pytest-cs": {
|
"pytest-cs": {
|
||||||
"git": "https://github.com/crowdsecurity/pytest-cs.git",
|
"git": "https://github.com/crowdsecurity/pytest-cs.git",
|
||||||
"ref": "8c49bd8072672c49855a7991a5900858b3ebb777"
|
"ref": "4a3451084215053af8a48ff37507b4f86bf75c10"
|
||||||
},
|
},
|
||||||
"pytest-datadir": {
|
"pytest-datadir": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -324,11 +304,11 @@
|
||||||
},
|
},
|
||||||
"pytest-xdist": {
|
"pytest-xdist": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1849bd98d8b242b948e472db7478e090bf3361912a8fed87992ed94085f54727",
|
"sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93",
|
||||||
"sha256:37290d161638a20b672401deef1cba812d110ac27e35d213f091d15b8beb40c9"
|
"sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==3.2.1"
|
"version": "==3.3.1"
|
||||||
},
|
},
|
||||||
"python-dotenv": {
|
"python-dotenv": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -386,42 +366,35 @@
|
||||||
},
|
},
|
||||||
"requests": {
|
"requests": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa",
|
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
|
||||||
"sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"
|
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7' and python_version < '4'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==2.28.2"
|
"version": "==2.31.0"
|
||||||
},
|
|
||||||
"tomli": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
|
|
||||||
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
|
|
||||||
],
|
|
||||||
"markers": "python_version < '3.11'",
|
|
||||||
"version": "==2.0.1"
|
|
||||||
},
|
},
|
||||||
"trustme": {
|
"trustme": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:5e07b23d70ceed64f3bb36ae4b9abc52354c16c98d45ab037bee2b5fbffe586c",
|
"sha256:1d4f0b0fe28091506edc29c19ad90cca387646add436c3ca66ba7bcc53807f55",
|
||||||
"sha256:a6e53039cc43e70548ebd9a42ec1af5cba803a16d14321cd96352d2b4e010e04"
|
"sha256:7a9f82ad494d661cd10c9eed38e0f708154eb59a2e415da6b02af3e5dac53134"
|
||||||
],
|
],
|
||||||
"version": "==0.9.0"
|
"markers": "python_version >= '3.7'",
|
||||||
|
"version": "==1.0.0"
|
||||||
},
|
},
|
||||||
"urllib3": {
|
"urllib3": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305",
|
"sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc",
|
||||||
"sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"
|
"sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==1.26.15"
|
"version": "==2.0.2"
|
||||||
},
|
},
|
||||||
"websocket-client": {
|
"websocket-client": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:3f09e6d8230892547132177f575a4e3e73cfdf06526e20cc02aa1c3b47184d40",
|
"sha256:c7d67c13b928645f259d9b847ab5b57fd2d127213ca41ebd880de1f553b7c23b",
|
||||||
"sha256:cdf5877568b7e83aa7cf2244ab56a3213de587bbe0ce9d8b9600fc77b455d89e"
|
"sha256:f8c64e28cd700e7ba1f04350d66422b6833b82a796b525a51e740b8cc8dab4b1"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==1.5.1"
|
"version": "==1.5.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"develop": {
|
"develop": {
|
||||||
|
@ -444,7 +417,7 @@
|
||||||
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
|
||||||
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
"sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"
|
||||||
],
|
],
|
||||||
"markers": "python_version < '3.11' and python_version >= '3.7'",
|
"markers": "python_version >= '3.11'",
|
||||||
"version": "==5.1.1"
|
"version": "==5.1.1"
|
||||||
},
|
},
|
||||||
"executing": {
|
"executing": {
|
||||||
|
@ -497,11 +470,11 @@
|
||||||
},
|
},
|
||||||
"ipython": {
|
"ipython": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:5b54478e459155a326bf5f42ee4f29df76258c0279c36f21d71ddb560f88b156",
|
"sha256:7dff3fad32b97f6488e02f87b970f309d082f758d7b7fc252e3b19ee0e432dbb",
|
||||||
"sha256:735cede4099dbc903ee540307b9171fbfef4aa75cfcacc5a273b2cda2f02be04"
|
"sha256:ffca270240fbd21b06b2974e14a86494d6d29290184e788275f55e0b55914926"
|
||||||
],
|
],
|
||||||
"markers": "python_version < '3.11' and python_version >= '3.7'",
|
"markers": "python_version >= '3.11'",
|
||||||
"version": "==8.11.0"
|
"version": "==8.13.2"
|
||||||
},
|
},
|
||||||
"jedi": {
|
"jedi": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -566,11 +539,11 @@
|
||||||
},
|
},
|
||||||
"pygments": {
|
"pygments": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297",
|
"sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c",
|
||||||
"sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"
|
"sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==2.14.0"
|
"version": "==2.15.1"
|
||||||
},
|
},
|
||||||
"six": {
|
"six": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -587,14 +560,6 @@
|
||||||
],
|
],
|
||||||
"version": "==0.6.2"
|
"version": "==0.6.2"
|
||||||
},
|
},
|
||||||
"tomli": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
|
|
||||||
"sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
|
|
||||||
],
|
|
||||||
"markers": "python_version < '3.11'",
|
|
||||||
"version": "==2.0.1"
|
|
||||||
},
|
|
||||||
"traitlets": {
|
"traitlets": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8",
|
"sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8",
|
||||||
|
|
32
docker/test/tests/test_capi_whitelists.py
Normal file
32
docker/test/tests/test_capi_whitelists.py
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
from http import HTTPStatus
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
pytestmark = pytest.mark.docker
|
||||||
|
|
||||||
|
|
||||||
|
def test_capi_whitelists(crowdsec, tmp_path_factory, flavor,):
|
||||||
|
"""Test CAPI_WHITELISTS_PATH"""
|
||||||
|
env = {
|
||||||
|
"CAPI_WHITELISTS_PATH": "/path/to/whitelists.yaml"
|
||||||
|
}
|
||||||
|
|
||||||
|
whitelists = tmp_path_factory.mktemp("whitelists")
|
||||||
|
with open(whitelists / "whitelists.yaml", "w") as f:
|
||||||
|
yaml.dump({"ips": ["1.2.3.4", "2.3.4.5"], "cidrs": ["1.2.3.0/24"]}, f)
|
||||||
|
|
||||||
|
volumes = {
|
||||||
|
whitelists / "whitelists.yaml": {"bind": "/path/to/whitelists.yaml", "mode": "ro"}
|
||||||
|
}
|
||||||
|
|
||||||
|
with crowdsec(flavor=flavor, environment=env, volumes=volumes) as cs:
|
||||||
|
cs.wait_for_log("*Starting processing data*")
|
||||||
|
cs.wait_for_http(8080, '/health', want_status=HTTPStatus.OK)
|
||||||
|
res = cs.cont.exec_run(f'cscli config show-yaml')
|
||||||
|
assert res.exit_code == 0
|
||||||
|
stdout = res.output.decode()
|
||||||
|
y = yaml.safe_load(stdout)
|
||||||
|
assert y['api']['server']['capi_whitelists_path'] == '/path/to/whitelists.yaml'
|
12
go.mod
12
go.mod
|
@ -48,11 +48,11 @@ require (
|
||||||
github.com/prometheus/client_model v0.3.0
|
github.com/prometheus/client_model v0.3.0
|
||||||
github.com/prometheus/prom2json v1.3.0
|
github.com/prometheus/prom2json v1.3.0
|
||||||
github.com/r3labs/diff/v2 v2.14.1
|
github.com/r3labs/diff/v2 v2.14.1
|
||||||
github.com/sirupsen/logrus v1.9.0
|
github.com/sirupsen/logrus v1.9.2
|
||||||
github.com/spf13/cobra v1.7.0
|
github.com/spf13/cobra v1.7.0
|
||||||
github.com/stretchr/testify v1.8.2
|
github.com/stretchr/testify v1.8.3
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
|
golang.org/x/crypto v0.1.0
|
||||||
golang.org/x/mod v0.8.0
|
golang.org/x/mod v0.6.0
|
||||||
google.golang.org/grpc v1.47.0
|
google.golang.org/grpc v1.47.0
|
||||||
google.golang.org/protobuf v1.28.1
|
google.golang.org/protobuf v1.28.1
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
|
@ -72,6 +72,7 @@ require (
|
||||||
github.com/cespare/xxhash/v2 v2.1.2
|
github.com/cespare/xxhash/v2 v2.1.2
|
||||||
github.com/corazawaf/coraza/v3 v3.0.0-rc.2
|
github.com/corazawaf/coraza/v3 v3.0.0-rc.2
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0
|
github.com/coreos/go-systemd/v22 v22.5.0
|
||||||
|
github.com/crowdsecurity/go-cs-lib v0.0.0-20230531105801-4c1535c2b3bd
|
||||||
github.com/goccy/go-yaml v1.9.7
|
github.com/goccy/go-yaml v1.9.7
|
||||||
github.com/gofrs/uuid v4.0.0+incompatible
|
github.com/gofrs/uuid v4.0.0+incompatible
|
||||||
github.com/golang-jwt/jwt/v4 v4.2.0
|
github.com/golang-jwt/jwt/v4 v4.2.0
|
||||||
|
@ -85,6 +86,7 @@ require (
|
||||||
github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c
|
github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c
|
||||||
github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26
|
github.com/umahmood/haversine v0.0.0-20151105152445-808ab04add26
|
||||||
github.com/wasilibs/go-re2 v0.2.1
|
github.com/wasilibs/go-re2 v0.2.1
|
||||||
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
|
||||||
golang.org/x/sys v0.7.0
|
golang.org/x/sys v0.7.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
k8s.io/apiserver v0.22.5
|
k8s.io/apiserver v0.22.5
|
||||||
|
@ -103,7 +105,7 @@ require (
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/corazawaf/libinjection-go v0.1.2 // indirect
|
github.com/corazawaf/libinjection-go v0.1.2 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||||
github.com/docker/distribution v2.8.0+incompatible // indirect
|
github.com/docker/distribution v2.8.2+incompatible // indirect
|
||||||
github.com/docker/go-units v0.4.0 // indirect
|
github.com/docker/go-units v0.4.0 // indirect
|
||||||
github.com/gin-contrib/sse v0.1.0 // indirect
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
github.com/go-logr/logr v1.2.3 // indirect
|
github.com/go-logr/logr v1.2.3 // indirect
|
||||||
|
|
19
go.sum
19
go.sum
|
@ -174,6 +174,8 @@ github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
||||||
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
github.com/crowdsecurity/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:r97WNVC30Uen+7WnLs4xDScS/Ex988+id2k6mDf8psU=
|
github.com/crowdsecurity/dlog v0.0.0-20170105205344-4fb5f8204f26 h1:r97WNVC30Uen+7WnLs4xDScS/Ex988+id2k6mDf8psU=
|
||||||
github.com/crowdsecurity/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:zpv7r+7KXwgVUZnUNjyP22zc/D7LKjyoY02weH2RBbk=
|
github.com/crowdsecurity/dlog v0.0.0-20170105205344-4fb5f8204f26/go.mod h1:zpv7r+7KXwgVUZnUNjyP22zc/D7LKjyoY02weH2RBbk=
|
||||||
|
github.com/crowdsecurity/go-cs-lib v0.0.0-20230531105801-4c1535c2b3bd h1:Y70ceDKAKYFXTnxEjXuBDSh07umvDhbX3PCCYhdtsZ0=
|
||||||
|
github.com/crowdsecurity/go-cs-lib v0.0.0-20230531105801-4c1535c2b3bd/go.mod h1:9JJLSpGj1ZXnROV3xAcJvS/HTaUvuA8K3gGOpO4tfVc=
|
||||||
github.com/crowdsecurity/grokky v0.2.1 h1:t4VYnDlAd0RjDM2SlILalbwfCrQxtJSMGdQOR0zwkE4=
|
github.com/crowdsecurity/grokky v0.2.1 h1:t4VYnDlAd0RjDM2SlILalbwfCrQxtJSMGdQOR0zwkE4=
|
||||||
github.com/crowdsecurity/grokky v0.2.1/go.mod h1:33usDIYzGDsgX1kHAThCbseso6JuWNJXOzRQDGXHtWM=
|
github.com/crowdsecurity/grokky v0.2.1/go.mod h1:33usDIYzGDsgX1kHAThCbseso6JuWNJXOzRQDGXHtWM=
|
||||||
github.com/crowdsecurity/machineid v1.0.2 h1:wpkpsUghJF8Khtmn/tg6GxgdhLA1Xflerh5lirI+bdc=
|
github.com/crowdsecurity/machineid v1.0.2 h1:wpkpsUghJF8Khtmn/tg6GxgdhLA1Xflerh5lirI+bdc=
|
||||||
|
@ -185,8 +187,8 @@ github.com/dghubble/sling v1.3.0 h1:pZHjCJq4zJvc6qVQ5wN1jo5oNZlNE0+8T/h0XeXBUKU=
|
||||||
github.com/dghubble/sling v1.3.0/go.mod h1:XXShWaBWKzNLhu2OxikSNFrlsvowtz4kyRuXUG7oQKY=
|
github.com/dghubble/sling v1.3.0/go.mod h1:XXShWaBWKzNLhu2OxikSNFrlsvowtz4kyRuXUG7oQKY=
|
||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
|
||||||
github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY=
|
github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
|
||||||
github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||||
github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
|
github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
|
||||||
github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||||
|
@ -847,8 +849,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
|
||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
|
||||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
|
github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
|
||||||
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
|
||||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
|
@ -887,8 +889,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
|
||||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/tetratelabs/wazero v1.0.0-rc.2 h1:OA3UUynnoqxrjCQ94mpAtdO4/oMxFQVNL2BXDMOc66Q=
|
github.com/tetratelabs/wazero v1.0.0-rc.2 h1:OA3UUynnoqxrjCQ94mpAtdO4/oMxFQVNL2BXDMOc66Q=
|
||||||
github.com/tetratelabs/wazero v1.0.0-rc.2/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ=
|
github.com/tetratelabs/wazero v1.0.0-rc.2/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ=
|
||||||
|
@ -1016,8 +1018,9 @@ golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWP
|
||||||
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||||
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
|
|
||||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
|
golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU=
|
||||||
|
golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
@ -1028,6 +1031,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
||||||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
|
||||||
|
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
|
||||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
|
|
||||||
BUILD_REQUIRE_GO_MAJOR ?= 1
|
|
||||||
BUILD_REQUIRE_GO_MINOR ?= 20
|
|
||||||
|
|
||||||
BUILD_GOVERSION = $(subst go,,$(shell go env GOVERSION))
|
BUILD_GOVERSION = $(subst go,,$(shell go env GOVERSION))
|
||||||
|
|
||||||
go_major_minor = $(subst ., ,$(BUILD_GOVERSION))
|
go_major_minor = $(subst ., ,$(BUILD_GOVERSION))
|
||||||
|
@ -10,8 +7,19 @@ GO_MINOR_VERSION = $(word 2, $(go_major_minor))
|
||||||
|
|
||||||
GO_VERSION_VALIDATION_ERR_MSG = Golang version ($(BUILD_GOVERSION)) is not supported, please use at least $(BUILD_REQUIRE_GO_MAJOR).$(BUILD_REQUIRE_GO_MINOR)
|
GO_VERSION_VALIDATION_ERR_MSG = Golang version ($(BUILD_GOVERSION)) is not supported, please use at least $(BUILD_REQUIRE_GO_MAJOR).$(BUILD_REQUIRE_GO_MINOR)
|
||||||
|
|
||||||
|
|
||||||
.PHONY: goversion
|
.PHONY: goversion
|
||||||
goversion:
|
goversion: $(if $(findstring devel,$(shell go env GOVERSION)),goversion_devel,goversion_check)
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: goversion_devel
|
||||||
|
goversion_devel:
|
||||||
|
$(warning WARNING: You are using a development version of Golang ($(BUILD_GOVERSION)) which is not supported. For production environments, use a stable version (at least $(BUILD_REQUIRE_GO_MAJOR).$(BUILD_REQUIRE_GO_MINOR)))
|
||||||
|
$(info )
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: goversion_check
|
||||||
|
goversion_check:
|
||||||
ifneq ($(OS), Windows_NT)
|
ifneq ($(OS), Windows_NT)
|
||||||
@if [ $(GO_MAJOR_VERSION) -gt $(BUILD_REQUIRE_GO_MAJOR) ]; then \
|
@if [ $(GO_MAJOR_VERSION) -gt $(BUILD_REQUIRE_GO_MAJOR) ]; then \
|
||||||
exit 0; \
|
exit 0; \
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
|
||||||
|
BUILD_CODENAME ?= alphaga
|
||||||
|
GOARCH ?= $(shell go env GOARCH)
|
||||||
|
BUILD_TAG ?= $(shell git rev-parse HEAD)
|
||||||
|
|
||||||
ifeq ($(OS), Windows_NT)
|
ifeq ($(OS), Windows_NT)
|
||||||
SHELL := pwsh.exe
|
SHELL := pwsh.exe
|
||||||
.SHELLFLAGS := -NoProfile -Command
|
.SHELLFLAGS := -NoProfile -Command
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
# FreeBSD specific
|
# FreeBSD specific
|
||||||
|
|
||||||
MAKE=gmake
|
MAKE=gmake
|
||||||
|
|
||||||
$(info building for FreeBSD)
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
# Linux specific
|
# Linux specific
|
||||||
|
|
||||||
MAKE=make
|
MAKE=make
|
||||||
|
|
||||||
$(info Building for linux)
|
|
|
@ -1,5 +1,3 @@
|
||||||
# OpenBSD specific
|
# OpenBSD specific
|
||||||
|
|
||||||
MAKE=gmake
|
MAKE=gmake
|
||||||
|
|
||||||
$(info building for OpenBSD)
|
|
||||||
|
|
|
@ -6,12 +6,9 @@ MKDIR=mkdir -p
|
||||||
|
|
||||||
# Go should not be required to run functional tests
|
# Go should not be required to run functional tests
|
||||||
GOOS ?= $(shell go env GOOS)
|
GOOS ?= $(shell go env GOOS)
|
||||||
GOARCH ?= $(shell go env GOARCH)
|
|
||||||
|
|
||||||
#Current versioning information from env
|
#Current versioning information from env
|
||||||
BUILD_VERSION?=$(shell git describe --tags)
|
BUILD_VERSION?=$(shell git describe --tags)
|
||||||
BUILD_CODENAME="alphaga"
|
|
||||||
BUILD_TIMESTAMP=$(shell date +%F"_"%T)
|
BUILD_TIMESTAMP=$(shell date +%F"_"%T)
|
||||||
BUILD_TAG?=$(shell git rev-parse HEAD)
|
|
||||||
DEFAULT_CONFIGDIR?=/etc/crowdsec
|
DEFAULT_CONFIGDIR?=/etc/crowdsec
|
||||||
DEFAULT_DATADIR?=/var/lib/crowdsec/data
|
DEFAULT_DATADIR?=/var/lib/crowdsec/data
|
||||||
|
|
|
@ -4,16 +4,11 @@ MAKE=make
|
||||||
GOOS=windows
|
GOOS=windows
|
||||||
PREFIX=$(shell $$env:TEMP)
|
PREFIX=$(shell $$env:TEMP)
|
||||||
|
|
||||||
GOOS ?= $(shell go env GOOS)
|
|
||||||
GOARCH ?= $(shell go env GOARCH)
|
|
||||||
|
|
||||||
#Current versioning information from env
|
#Current versioning information from env
|
||||||
#BUILD_VERSION?=$(shell (Invoke-WebRequest -UseBasicParsing -Uri https://api.github.com/repos/crowdsecurity/crowdsec/releases/latest).Content | jq -r '.tag_name')
|
#BUILD_VERSION?=$(shell (Invoke-WebRequest -UseBasicParsing -Uri https://api.github.com/repos/crowdsecurity/crowdsec/releases/latest).Content | jq -r '.tag_name')
|
||||||
#hardcode it till i find a workaround
|
#hardcode it till i find a workaround
|
||||||
BUILD_VERSION?=$(shell git describe --tags $$(git rev-list --tags --max-count=1))
|
BUILD_VERSION?=$(shell git describe --tags $$(git rev-list --tags --max-count=1))
|
||||||
BUILD_CODENAME?=alphaga
|
|
||||||
BUILD_TIMESTAMP?=$(shell Get-Date -Format "yyyy-MM-dd_HH:mm:ss")
|
BUILD_TIMESTAMP?=$(shell Get-Date -Format "yyyy-MM-dd_HH:mm:ss")
|
||||||
BUILD_TAG?=$(shell git rev-parse HEAD)
|
|
||||||
DEFAULT_CONFIGDIR?=C:\\ProgramData\\CrowdSec\\config
|
DEFAULT_CONFIGDIR?=C:\\ProgramData\\CrowdSec\\config
|
||||||
DEFAULT_DATADIR?=C:\\ProgramData\\CrowdSec\\data
|
DEFAULT_DATADIR?=C:\\ProgramData\\CrowdSec\\data
|
||||||
|
|
||||||
|
@ -23,5 +18,3 @@ CP=Copy-Item
|
||||||
CPR=Copy-Item -Recurse
|
CPR=Copy-Item -Recurse
|
||||||
MKDIR=New-Item -ItemType directory
|
MKDIR=New-Item -ItemType directory
|
||||||
WIN_IGNORE_ERR=; exit 0
|
WIN_IGNORE_ERR=; exit 0
|
||||||
|
|
||||||
$(info Building for windows)
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ import (
|
||||||
tomb "gopkg.in/tomb.v2"
|
tomb "gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
cloudwatchacquisition "github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/cloudwatch"
|
cloudwatchacquisition "github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/cloudwatch"
|
||||||
dockeracquisition "github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/docker"
|
dockeracquisition "github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/docker"
|
||||||
|
@ -243,7 +245,7 @@ func GetMetrics(sources []DataSource, aggregated bool) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func transform(transformChan chan types.Event, output chan types.Event, AcquisTomb *tomb.Tomb, transformRuntime *vm.Program, logger *log.Entry) {
|
func transform(transformChan chan types.Event, output chan types.Event, AcquisTomb *tomb.Tomb, transformRuntime *vm.Program, logger *log.Entry) {
|
||||||
defer types.CatchPanic("crowdsec/acquis")
|
defer trace.CatchPanic("crowdsec/acquis")
|
||||||
logger.Infof("transformer started")
|
logger.Infof("transformer started")
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
@ -298,7 +300,7 @@ func StartAcquisition(sources []DataSource, output chan types.Event, AcquisTomb
|
||||||
log.Debugf("starting one source %d/%d ->> %T", i, len(sources), subsrc)
|
log.Debugf("starting one source %d/%d ->> %T", i, len(sources), subsrc)
|
||||||
|
|
||||||
AcquisTomb.Go(func() error {
|
AcquisTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis")
|
defer trace.CatchPanic("crowdsec/acquis")
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
outChan := output
|
outChan := output
|
||||||
|
|
|
@ -13,9 +13,10 @@ import (
|
||||||
tomb "gopkg.in/tomb.v2"
|
tomb "gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,10 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
|
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
|
@ -11,7 +11,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
dockerTypes "github.com/docker/docker/api/types"
|
dockerTypes "github.com/docker/docker/api/types"
|
||||||
dockerContainer "github.com/docker/docker/api/types/container"
|
dockerContainer "github.com/docker/docker/api/types/container"
|
||||||
|
|
|
@ -14,6 +14,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/fsnotify/fsnotify"
|
"github.com/fsnotify/fsnotify"
|
||||||
"github.com/nxadm/tail"
|
"github.com/nxadm/tail"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -39,6 +41,7 @@ type FileConfiguration struct {
|
||||||
Filename string
|
Filename string
|
||||||
ForceInotify bool `yaml:"force_inotify"`
|
ForceInotify bool `yaml:"force_inotify"`
|
||||||
MaxBufferSize int `yaml:"max_buffer_size"`
|
MaxBufferSize int `yaml:"max_buffer_size"`
|
||||||
|
PollWithoutInotify bool `yaml:"poll_without_inotify"`
|
||||||
configuration.DataSourceCommonCfg `yaml:",inline"`
|
configuration.DataSourceCommonCfg `yaml:",inline"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,14 +331,14 @@ func (f *FileSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) er
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
tail, err := tail.TailFile(file, tail.Config{ReOpen: true, Follow: true, Poll: true, Location: &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd}, Logger: log.NewEntry(log.StandardLogger())})
|
tail, err := tail.TailFile(file, tail.Config{ReOpen: true, Follow: true, Poll: f.config.PollWithoutInotify, Location: &tail.SeekInfo{Offset: 0, Whence: io.SeekEnd}, Logger: log.NewEntry(log.StandardLogger())})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
f.logger.Errorf("Could not start tailing file %s : %s", file, err)
|
f.logger.Errorf("Could not start tailing file %s : %s", file, err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
f.tails[file] = true
|
f.tails[file] = true
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/file/live/fsnotify")
|
defer trace.CatchPanic("crowdsec/acquis/file/live/fsnotify")
|
||||||
return f.tailFile(out, t, tail)
|
return f.tailFile(out, t, tail)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -411,14 +414,14 @@ func (f *FileSource) monitorNewFiles(out chan types.Event, t *tomb.Tomb) error {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
//Slightly different parameters for Location, as we want to read the first lines of the newly created file
|
//Slightly different parameters for Location, as we want to read the first lines of the newly created file
|
||||||
tail, err := tail.TailFile(event.Name, tail.Config{ReOpen: true, Follow: true, Poll: true, Location: &tail.SeekInfo{Offset: 0, Whence: io.SeekStart}})
|
tail, err := tail.TailFile(event.Name, tail.Config{ReOpen: true, Follow: true, Poll: f.config.PollWithoutInotify, Location: &tail.SeekInfo{Offset: 0, Whence: io.SeekStart}})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Errorf("Could not start tailing file %s : %s", event.Name, err)
|
logger.Errorf("Could not start tailing file %s : %s", event.Name, err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
f.tails[event.Name] = true
|
f.tails[event.Name] = true
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/tailfile")
|
defer trace.CatchPanic("crowdsec/acquis/tailfile")
|
||||||
return f.tailFile(out, t, tail)
|
return f.tailFile(out, t, tail)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,8 +13,9 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
fileacquisition "github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/file"
|
fileacquisition "github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/file"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@ import (
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
@ -257,7 +259,7 @@ func (j *JournalCtlSource) GetName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *JournalCtlSource) OneShotAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
func (j *JournalCtlSource) OneShotAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/journalctl/oneshot")
|
defer trace.CatchPanic("crowdsec/acquis/journalctl/oneshot")
|
||||||
err := j.runJournalCtl(out, t)
|
err := j.runJournalCtl(out, t)
|
||||||
j.logger.Debug("Oneshot journalctl acquisition is done")
|
j.logger.Debug("Oneshot journalctl acquisition is done")
|
||||||
return err
|
return err
|
||||||
|
@ -266,7 +268,7 @@ func (j *JournalCtlSource) OneShotAcquisition(out chan types.Event, t *tomb.Tomb
|
||||||
|
|
||||||
func (j *JournalCtlSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
func (j *JournalCtlSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/journalctl/streaming")
|
defer trace.CatchPanic("crowdsec/acquis/journalctl/streaming")
|
||||||
return j.runJournalCtl(out, t)
|
return j.runJournalCtl(out, t)
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -8,7 +8,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/sirupsen/logrus/hooks/test"
|
"github.com/sirupsen/logrus/hooks/test"
|
||||||
|
|
|
@ -17,6 +17,8 @@ import (
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
@ -190,7 +192,7 @@ func (k *KafkaSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) e
|
||||||
k.logger.Infof("start reader on topic '%s'", k.Config.Topic)
|
k.logger.Infof("start reader on topic '%s'", k.Config.Topic)
|
||||||
|
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/kafka/live")
|
defer trace.CatchPanic("crowdsec/acquis/kafka/live")
|
||||||
return k.RunReader(out, t)
|
return k.RunReader(out, t)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -212,7 +214,13 @@ func (kc *KafkaConfiguration) NewTLSConfig() (*tls.Config, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return &tlsConfig, err
|
return &tlsConfig, err
|
||||||
}
|
}
|
||||||
caCertPool := x509.NewCertPool()
|
caCertPool, err := x509.SystemCertPool()
|
||||||
|
if err != nil {
|
||||||
|
return &tlsConfig, fmt.Errorf("unable to load system CA certificates: %w", err)
|
||||||
|
}
|
||||||
|
if caCertPool == nil {
|
||||||
|
caCertPool = x509.NewCertPool()
|
||||||
|
}
|
||||||
caCertPool.AppendCertsFromPEM(caCert)
|
caCertPool.AppendCertsFromPEM(caCert)
|
||||||
tlsConfig.RootCAs = caCertPool
|
tlsConfig.RootCAs = caCertPool
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
"github.com/segmentio/kafka-go"
|
"github.com/segmentio/kafka-go"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
|
@ -19,6 +19,8 @@ import (
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
@ -490,7 +492,7 @@ func (k *KinesisSource) ReadFromStream(out chan types.Event, t *tomb.Tomb) error
|
||||||
for _, shard := range shards.Shards {
|
for _, shard := range shards.Shards {
|
||||||
shardId := *shard.ShardId
|
shardId := *shard.ShardId
|
||||||
k.shardReaderTomb.Go(func() error {
|
k.shardReaderTomb.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/kinesis/streaming/shard")
|
defer trace.CatchPanic("crowdsec/acquis/kinesis/streaming/shard")
|
||||||
return k.ReadFromShard(out, shardId)
|
return k.ReadFromShard(out, shardId)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -514,7 +516,7 @@ func (k *KinesisSource) ReadFromStream(out chan types.Event, t *tomb.Tomb) error
|
||||||
|
|
||||||
func (k *KinesisSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
func (k *KinesisSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/kinesis/streaming")
|
defer trace.CatchPanic("crowdsec/acquis/kinesis/streaming")
|
||||||
if k.Config.UseEnhancedFanOut {
|
if k.Config.UseEnhancedFanOut {
|
||||||
return k.EnhancedRead(out, t)
|
return k.EnhancedRead(out, t)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -12,10 +12,11 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws"
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
"github.com/aws/aws-sdk-go/aws/session"
|
"github.com/aws/aws-sdk-go/aws/session"
|
||||||
"github.com/aws/aws-sdk-go/service/kinesis"
|
"github.com/aws/aws-sdk-go/service/kinesis"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
|
@ -8,6 +8,8 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -133,7 +135,7 @@ func (ka *KubernetesAuditSource) OneShotAcquisition(out chan types.Event, t *tom
|
||||||
func (ka *KubernetesAuditSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
func (ka *KubernetesAuditSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
||||||
ka.outChan = out
|
ka.outChan = out
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/k8s-audit/live")
|
defer trace.CatchPanic("crowdsec/acquis/k8s-audit/live")
|
||||||
ka.logger.Infof("Starting k8s-audit server on %s:%d%s", ka.config.ListenAddr, ka.config.ListenPort, ka.config.WebhookPath)
|
ka.logger.Infof("Starting k8s-audit server on %s:%d%s", ka.config.ListenAddr, ka.config.ListenPort, ka.config.WebhookPath)
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
err := ka.server.ListenAndServe()
|
err := ka.server.ListenAndServe()
|
||||||
|
|
|
@ -4,8 +4,9 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestPri(t *testing.T) {
|
func TestPri(t *testing.T) {
|
||||||
|
|
|
@ -12,6 +12,8 @@ import (
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/syslog/internal/parser/rfc3164"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/syslog/internal/parser/rfc3164"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/syslog/internal/parser/rfc5424"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/modules/syslog/internal/parser/rfc5424"
|
||||||
|
@ -142,7 +144,7 @@ func (s *SyslogSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb)
|
||||||
}
|
}
|
||||||
s.serverTomb = s.server.StartServer()
|
s.serverTomb = s.server.StartServer()
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/syslog/live")
|
defer trace.CatchPanic("crowdsec/acquis/syslog/live")
|
||||||
return s.handleSyslogMsg(out, t, c)
|
return s.handleSyslogMsg(out, t, c)
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -7,7 +7,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
|
@ -17,6 +17,8 @@ import (
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
"github.com/crowdsecurity/crowdsec/pkg/acquisition/configuration"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
)
|
)
|
||||||
|
@ -321,7 +323,7 @@ func (w *WinEventLogSource) CanRun() error {
|
||||||
|
|
||||||
func (w *WinEventLogSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
func (w *WinEventLogSource) StreamingAcquisition(out chan types.Event, t *tomb.Tomb) error {
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/acquis/wineventlog/streaming")
|
defer trace.CatchPanic("crowdsec/acquis/wineventlog/streaming")
|
||||||
return w.getEvents(out, t)
|
return w.getEvents(out, t)
|
||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -7,10 +7,12 @@ import (
|
||||||
|
|
||||||
"github.com/antonmedv/expr"
|
"github.com/antonmedv/expr"
|
||||||
"github.com/antonmedv/expr/vm"
|
"github.com/antonmedv/expr/vm"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
"github.com/crowdsecurity/crowdsec/pkg/exprhelpers"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -131,7 +133,7 @@ func EventToContext(events []types.Event) (models.Meta, []error) {
|
||||||
errors = append(errors, fmt.Errorf("unexpected return type for %s : %T", key, output))
|
errors = append(errors, fmt.Errorf("unexpected return type for %s : %T", key, output))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if val != "" && !types.InSlice(val, tmpContext[key]) {
|
if val != "" && !slices.Contains(tmpContext[key], val) {
|
||||||
tmpContext[key] = append(tmpContext[key], val)
|
tmpContext[key] = append(tmpContext[key], val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,8 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -31,7 +32,7 @@ func TestAlertsListAsMachine(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -233,7 +234,7 @@ func TestAlertsGetAsMachine(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -423,7 +424,7 @@ func TestAlertsCreateAsMachine(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -467,7 +468,7 @@ func TestAlertsDeleteAsMachine(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
|
|
@ -10,7 +10,8 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -86,7 +87,7 @@ func TestWatcherRegister(t *testing.T) {
|
||||||
clientconfig := Config{
|
clientconfig := Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
}
|
}
|
||||||
|
@ -128,7 +129,7 @@ func TestWatcherAuth(t *testing.T) {
|
||||||
clientConfig := &Config{
|
clientConfig := &Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
Scenarios: []string{"crowdsecurity/test"},
|
Scenarios: []string{"crowdsecurity/test"},
|
||||||
|
@ -216,7 +217,7 @@ func TestWatcherUnregister(t *testing.T) {
|
||||||
mycfg := &Config{
|
mycfg := &Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
Scenarios: []string{"crowdsecurity/test"},
|
Scenarios: []string{"crowdsecurity/test"},
|
||||||
|
@ -270,7 +271,7 @@ func TestWatcherEnroll(t *testing.T) {
|
||||||
mycfg := &Config{
|
mycfg := &Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
Scenarios: []string{"crowdsecurity/test"},
|
Scenarios: []string{"crowdsecurity/test"},
|
||||||
|
|
|
@ -8,7 +8,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,7 +24,7 @@ func TestNewRequestInvalid(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -56,7 +57,7 @@ func TestNewRequestTimeout(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
|
|
@ -11,8 +11,9 @@ import (
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*this is a ripoff of google/go-github approach :
|
/*this is a ripoff of google/go-github approach :
|
||||||
|
@ -55,7 +56,7 @@ func TestNewClientOk(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -92,7 +93,7 @@ func TestNewClientKo(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
@ -143,7 +144,7 @@ func TestNewClientRegisterKO(t *testing.T) {
|
||||||
_, err = RegisterClient(&Config{
|
_, err = RegisterClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
}, &http.Client{})
|
}, &http.Client{})
|
||||||
|
@ -173,7 +174,7 @@ func TestNewClientRegisterOK(t *testing.T) {
|
||||||
client, err := RegisterClient(&Config{
|
client, err := RegisterClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
}, &http.Client{})
|
}, &http.Client{})
|
||||||
|
@ -201,7 +202,7 @@ func TestNewClientBadAnswer(t *testing.T) {
|
||||||
_, err = RegisterClient(&Config{
|
_, err = RegisterClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
}, &http.Client{})
|
}, &http.Client{})
|
||||||
|
|
|
@ -6,6 +6,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/modelscapi"
|
"github.com/crowdsecurity/crowdsec/pkg/modelscapi"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
|
@ -102,10 +104,10 @@ func (s *DecisionsService) GetDecisionsFromGroups(decisionsGroups []*modelscapi.
|
||||||
partialDecisions[idx] = &models.Decision{
|
partialDecisions[idx] = &models.Decision{
|
||||||
Scenario: decisionsGroup.Scenario,
|
Scenario: decisionsGroup.Scenario,
|
||||||
Scope: decisionsGroup.Scope,
|
Scope: decisionsGroup.Scope,
|
||||||
Type: types.StrPtr(types.DecisionTypeBan),
|
Type: ptr.Of(types.DecisionTypeBan),
|
||||||
Value: decision.Value,
|
Value: decision.Value,
|
||||||
Duration: decision.Duration,
|
Duration: decision.Duration,
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
decisions = append(decisions, partialDecisions...)
|
decisions = append(decisions, partialDecisions...)
|
||||||
|
@ -138,10 +140,10 @@ func (s *DecisionsService) FetchV3Decisions(ctx context.Context, url string) (*m
|
||||||
partialDecisions[idx] = &models.Decision{
|
partialDecisions[idx] = &models.Decision{
|
||||||
Scenario: &scenarioDeleted,
|
Scenario: &scenarioDeleted,
|
||||||
Scope: decisionsGroup.Scope,
|
Scope: decisionsGroup.Scope,
|
||||||
Type: types.StrPtr(types.DecisionTypeBan),
|
Type: ptr.Of(types.DecisionTypeBan),
|
||||||
Value: &decision,
|
Value: &decision,
|
||||||
Duration: &durationDeleted,
|
Duration: &durationDeleted,
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
v2Decisions.Deleted = append(v2Decisions.Deleted, partialDecisions...)
|
v2Decisions.Deleted = append(v2Decisions.Deleted, partialDecisions...)
|
||||||
|
@ -210,7 +212,7 @@ func (s *DecisionsService) GetDecisionsFromBlocklist(ctx context.Context, blockl
|
||||||
Type: blocklist.Remediation,
|
Type: blocklist.Remediation,
|
||||||
Value: &decision,
|
Value: &decision,
|
||||||
Duration: blocklist.Duration,
|
Duration: blocklist.Duration,
|
||||||
Origin: types.StrPtr(types.ListOrigin),
|
Origin: ptr.Of(types.ListOrigin),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,11 @@ import (
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/modelscapi"
|
"github.com/crowdsecurity/crowdsec/pkg/modelscapi"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -460,7 +461,7 @@ func TestDecisionsFromBlocklist(t *testing.T) {
|
||||||
Remediation: &tremediationBlocklist,
|
Remediation: &tremediationBlocklist,
|
||||||
Name: &tnameBlocklist,
|
Name: &tnameBlocklist,
|
||||||
Duration: &tdurationBlocklist,
|
Duration: &tdurationBlocklist,
|
||||||
}, types.StrPtr("Sun, 01 Jan 2023 01:01:01 GMT"))
|
}, ptr.Of("Sun, 01 Jan 2023 01:01:01 GMT"))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.False(t, isModified)
|
assert.False(t, isModified)
|
||||||
_, isModified, err = newcli.Decisions.GetDecisionsFromBlocklist(context.Background(), &modelscapi.BlocklistLink{
|
_, isModified, err = newcli.Decisions.GetDecisionsFromBlocklist(context.Background(), &modelscapi.BlocklistLink{
|
||||||
|
@ -469,7 +470,7 @@ func TestDecisionsFromBlocklist(t *testing.T) {
|
||||||
Remediation: &tremediationBlocklist,
|
Remediation: &tremediationBlocklist,
|
||||||
Name: &tnameBlocklist,
|
Name: &tnameBlocklist,
|
||||||
Duration: &tdurationBlocklist,
|
Duration: &tdurationBlocklist,
|
||||||
}, types.StrPtr("Mon, 02 Jan 2023 01:01:01 GMT"))
|
}, ptr.Of("Mon, 02 Jan 2023 01:01:01 GMT"))
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.True(t, isModified)
|
assert.True(t, isModified)
|
||||||
}
|
}
|
||||||
|
@ -495,7 +496,7 @@ func TestDeleteDecisions(t *testing.T) {
|
||||||
client, err := NewClient(&Config{
|
client, err := NewClient(&Config{
|
||||||
MachineID: "test_login",
|
MachineID: "test_login",
|
||||||
Password: "test_password",
|
Password: "test_password",
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
VersionPrefix: "v1",
|
VersionPrefix: "v1",
|
||||||
})
|
})
|
||||||
|
|
|
@ -6,9 +6,10 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
tomb "gopkg.in/tomb.v2"
|
tomb "gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HeartBeatService service
|
type HeartBeatService service
|
||||||
|
@ -32,7 +33,7 @@ func (h *HeartBeatService) Ping(ctx context.Context) (bool, *Response, error) {
|
||||||
|
|
||||||
func (h *HeartBeatService) StartHeartBeat(ctx context.Context, t *tomb.Tomb) {
|
func (h *HeartBeatService) StartHeartBeat(ctx context.Context, t *tomb.Tomb) {
|
||||||
t.Go(func() error {
|
t.Go(func() error {
|
||||||
defer types.CatchPanic("crowdsec/apiClient/heartbeat")
|
defer trace.CatchPanic("crowdsec/apiClient/heartbeat")
|
||||||
hbTimer := time.NewTicker(1 * time.Minute)
|
hbTimer := time.NewTicker(1 * time.Minute)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
|
@ -28,7 +28,7 @@ type LAPI struct {
|
||||||
|
|
||||||
func SetupLAPITest(t *testing.T) LAPI {
|
func SetupLAPITest(t *testing.T) LAPI {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
router, loginResp, config, err := InitMachineTest()
|
router, loginResp, config, err := InitMachineTest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -68,8 +68,8 @@ func (l *LAPI) RecordResponse(verb string, url string, body *strings.Reader, aut
|
||||||
return w
|
return w
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitMachineTest() (*gin.Engine, models.WatcherAuthResponse, csconfig.Config, error) {
|
func InitMachineTest(t *testing.T) (*gin.Engine, models.WatcherAuthResponse, csconfig.Config, error) {
|
||||||
router, config, err := NewAPITest()
|
router, config, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, models.WatcherAuthResponse{}, config, fmt.Errorf("unable to run local API: %s", err)
|
return nil, models.WatcherAuthResponse{}, config, fmt.Errorf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -151,7 +151,7 @@ func TestCreateAlert(t *testing.T) {
|
||||||
|
|
||||||
func TestCreateAlertChannels(t *testing.T) {
|
func TestCreateAlertChannels(t *testing.T) {
|
||||||
|
|
||||||
apiServer, config, err := NewAPIServer()
|
apiServer, config, err := NewAPIServer(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
@ -443,7 +443,7 @@ func TestDeleteAlertByID(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteAlertTrustedIPS(t *testing.T) {
|
func TestDeleteAlertTrustedIPS(t *testing.T) {
|
||||||
cfg := LoadTestConfig()
|
cfg := LoadTestConfig(t)
|
||||||
// IPv6 mocking doesn't seem to work.
|
// IPv6 mocking doesn't seem to work.
|
||||||
// cfg.API.Server.TrustedIPs = []string{"1.2.3.4", "1.2.4.0/24", "::"}
|
// cfg.API.Server.TrustedIPs = []string{"1.2.3.4", "1.2.4.0/24", "::"}
|
||||||
cfg.API.Server.TrustedIPs = []string{"1.2.3.4", "1.2.4.0/24"}
|
cfg.API.Server.TrustedIPs = []string{"1.2.3.4", "1.2.4.0/24"}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAPIKey(t *testing.T) {
|
func TestAPIKey(t *testing.T) {
|
||||||
router, config, err := NewAPITest()
|
router, config, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,15 @@ import (
|
||||||
"github.com/go-openapi/strfmt"
|
"github.com/go-openapi/strfmt"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database/ent"
|
"github.com/crowdsecurity/crowdsec/pkg/database/ent"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database/ent/alert"
|
"github.com/crowdsecurity/crowdsec/pkg/database/ent/alert"
|
||||||
|
@ -81,7 +85,7 @@ func (a *apic) FetchScenariosListFromDB() ([]string, error) {
|
||||||
machineScenarios := strings.Split(v.Scenarios, ",")
|
machineScenarios := strings.Split(v.Scenarios, ",")
|
||||||
log.Debugf("%d scenarios for machine %d", len(machineScenarios), v.ID)
|
log.Debugf("%d scenarios for machine %d", len(machineScenarios), v.ID)
|
||||||
for _, sv := range machineScenarios {
|
for _, sv := range machineScenarios {
|
||||||
if !types.InSlice(sv, scenarios) && sv != "" {
|
if !slices.Contains(scenarios, sv) && sv != "" {
|
||||||
scenarios = append(scenarios, sv)
|
scenarios = append(scenarios, sv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,15 +98,15 @@ func decisionsToApiDecisions(decisions []*models.Decision) models.AddSignalsRequ
|
||||||
apiDecisions := models.AddSignalsRequestItemDecisions{}
|
apiDecisions := models.AddSignalsRequestItemDecisions{}
|
||||||
for _, decision := range decisions {
|
for _, decision := range decisions {
|
||||||
x := &models.AddSignalsRequestItemDecisionsItem{
|
x := &models.AddSignalsRequestItemDecisionsItem{
|
||||||
Duration: types.StrPtr(*decision.Duration),
|
Duration: ptr.Of(*decision.Duration),
|
||||||
ID: new(int64),
|
ID: new(int64),
|
||||||
Origin: types.StrPtr(*decision.Origin),
|
Origin: ptr.Of(*decision.Origin),
|
||||||
Scenario: types.StrPtr(*decision.Scenario),
|
Scenario: ptr.Of(*decision.Scenario),
|
||||||
Scope: types.StrPtr(*decision.Scope),
|
Scope: ptr.Of(*decision.Scope),
|
||||||
//Simulated: *decision.Simulated,
|
//Simulated: *decision.Simulated,
|
||||||
Type: types.StrPtr(*decision.Type),
|
Type: ptr.Of(*decision.Type),
|
||||||
Until: decision.Until,
|
Until: decision.Until,
|
||||||
Value: types.StrPtr(*decision.Value),
|
Value: ptr.Of(*decision.Value),
|
||||||
UUID: decision.UUID,
|
UUID: decision.UUID,
|
||||||
}
|
}
|
||||||
*x.ID = decision.ID
|
*x.ID = decision.ID
|
||||||
|
@ -193,7 +197,7 @@ func NewAPIC(config *csconfig.OnlineApiClientCfg, dbClient *database.Client, con
|
||||||
ret.apiClient, err = apiclient.NewClient(&apiclient.Config{
|
ret.apiClient, err = apiclient.NewClient(&apiclient.Config{
|
||||||
MachineID: config.Credentials.Login,
|
MachineID: config.Credentials.Login,
|
||||||
Password: password,
|
Password: password,
|
||||||
UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
UserAgent: fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
URL: apiURL,
|
URL: apiURL,
|
||||||
PapiURL: papiURL,
|
PapiURL: papiURL,
|
||||||
VersionPrefix: "v3",
|
VersionPrefix: "v3",
|
||||||
|
@ -231,7 +235,7 @@ func NewAPIC(config *csconfig.OnlineApiClientCfg, dbClient *database.Client, con
|
||||||
|
|
||||||
// keep track of all alerts in cache and push it to CAPI every PushInterval.
|
// keep track of all alerts in cache and push it to CAPI every PushInterval.
|
||||||
func (a *apic) Push() error {
|
func (a *apic) Push() error {
|
||||||
defer types.CatchPanic("lapi/pushToAPIC")
|
defer trace.CatchPanic("lapi/pushToAPIC")
|
||||||
|
|
||||||
var cache models.AddSignalsRequest
|
var cache models.AddSignalsRequest
|
||||||
ticker := time.NewTicker(a.pushIntervalFirst)
|
ticker := time.NewTicker(a.pushIntervalFirst)
|
||||||
|
@ -427,7 +431,7 @@ func (a *apic) HandleDeletedDecisionsV3(deletedDecisions []*modelscapi.GetDecisi
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, errors.Wrapf(err, "converting db ret %d", dbCliDel)
|
return 0, errors.Wrapf(err, "converting db ret %d", dbCliDel)
|
||||||
}
|
}
|
||||||
updateCounterForDecision(delete_counters, types.StrPtr(types.CAPIOrigin), nil, dbCliDel)
|
updateCounterForDecision(delete_counters, ptr.Of(types.CAPIOrigin), nil, dbCliDel)
|
||||||
nbDeleted += dbCliDel
|
nbDeleted += dbCliDel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -473,26 +477,26 @@ func createAlertsForDecisions(decisions []*models.Decision) []*models.Alert {
|
||||||
func createAlertForDecision(decision *models.Decision) *models.Alert {
|
func createAlertForDecision(decision *models.Decision) *models.Alert {
|
||||||
newAlert := &models.Alert{}
|
newAlert := &models.Alert{}
|
||||||
newAlert.Source = &models.Source{}
|
newAlert.Source = &models.Source{}
|
||||||
newAlert.Source.Scope = types.StrPtr("")
|
newAlert.Source.Scope = ptr.Of("")
|
||||||
if *decision.Origin == types.CAPIOrigin { //to make things more user friendly, we replace CAPI with community-blocklist
|
if *decision.Origin == types.CAPIOrigin { //to make things more user friendly, we replace CAPI with community-blocklist
|
||||||
newAlert.Scenario = types.StrPtr(types.CAPIOrigin)
|
newAlert.Scenario = ptr.Of(types.CAPIOrigin)
|
||||||
newAlert.Source.Scope = types.StrPtr(types.CAPIOrigin)
|
newAlert.Source.Scope = ptr.Of(types.CAPIOrigin)
|
||||||
} else if *decision.Origin == types.ListOrigin {
|
} else if *decision.Origin == types.ListOrigin {
|
||||||
newAlert.Scenario = types.StrPtr(*decision.Scenario)
|
newAlert.Scenario = ptr.Of(*decision.Scenario)
|
||||||
newAlert.Source.Scope = types.StrPtr(types.ListOrigin)
|
newAlert.Source.Scope = ptr.Of(types.ListOrigin)
|
||||||
} else {
|
} else {
|
||||||
log.Warningf("unknown origin %s", *decision.Origin)
|
log.Warningf("unknown origin %s", *decision.Origin)
|
||||||
}
|
}
|
||||||
newAlert.Message = types.StrPtr("")
|
newAlert.Message = ptr.Of("")
|
||||||
newAlert.Source.Value = types.StrPtr("")
|
newAlert.Source.Value = ptr.Of("")
|
||||||
newAlert.StartAt = types.StrPtr(time.Now().UTC().Format(time.RFC3339))
|
newAlert.StartAt = ptr.Of(time.Now().UTC().Format(time.RFC3339))
|
||||||
newAlert.StopAt = types.StrPtr(time.Now().UTC().Format(time.RFC3339))
|
newAlert.StopAt = ptr.Of(time.Now().UTC().Format(time.RFC3339))
|
||||||
newAlert.Capacity = types.Int32Ptr(0)
|
newAlert.Capacity = ptr.Of(int32(0))
|
||||||
newAlert.Simulated = types.BoolPtr(false)
|
newAlert.Simulated = ptr.Of(false)
|
||||||
newAlert.EventsCount = types.Int32Ptr(0)
|
newAlert.EventsCount = ptr.Of(int32(0))
|
||||||
newAlert.Leakspeed = types.StrPtr("")
|
newAlert.Leakspeed = ptr.Of("")
|
||||||
newAlert.ScenarioHash = types.StrPtr("")
|
newAlert.ScenarioHash = ptr.Of("")
|
||||||
newAlert.ScenarioVersion = types.StrPtr("")
|
newAlert.ScenarioVersion = ptr.Of("")
|
||||||
newAlert.MachineID = database.CapiMachineID
|
newAlert.MachineID = database.CapiMachineID
|
||||||
return newAlert
|
return newAlert
|
||||||
}
|
}
|
||||||
|
@ -769,16 +773,16 @@ func (a *apic) UpdateBlocklists(links *modelscapi.GetDecisionsStreamResponseLink
|
||||||
func setAlertScenario(add_counters map[string]map[string]int, delete_counters map[string]map[string]int, alert *models.Alert) *models.Alert {
|
func setAlertScenario(add_counters map[string]map[string]int, delete_counters map[string]map[string]int, alert *models.Alert) *models.Alert {
|
||||||
if *alert.Source.Scope == types.CAPIOrigin {
|
if *alert.Source.Scope == types.CAPIOrigin {
|
||||||
*alert.Source.Scope = SCOPE_CAPI_ALIAS_ALIAS
|
*alert.Source.Scope = SCOPE_CAPI_ALIAS_ALIAS
|
||||||
alert.Scenario = types.StrPtr(fmt.Sprintf("update : +%d/-%d IPs", add_counters[types.CAPIOrigin]["all"], delete_counters[types.CAPIOrigin]["all"]))
|
alert.Scenario = ptr.Of(fmt.Sprintf("update : +%d/-%d IPs", add_counters[types.CAPIOrigin]["all"], delete_counters[types.CAPIOrigin]["all"]))
|
||||||
} else if *alert.Source.Scope == types.ListOrigin {
|
} else if *alert.Source.Scope == types.ListOrigin {
|
||||||
*alert.Source.Scope = fmt.Sprintf("%s:%s", types.ListOrigin, *alert.Scenario)
|
*alert.Source.Scope = fmt.Sprintf("%s:%s", types.ListOrigin, *alert.Scenario)
|
||||||
alert.Scenario = types.StrPtr(fmt.Sprintf("update : +%d/-%d IPs", add_counters[types.ListOrigin][*alert.Scenario], delete_counters[types.ListOrigin][*alert.Scenario]))
|
alert.Scenario = ptr.Of(fmt.Sprintf("update : +%d/-%d IPs", add_counters[types.ListOrigin][*alert.Scenario], delete_counters[types.ListOrigin][*alert.Scenario]))
|
||||||
}
|
}
|
||||||
return alert
|
return alert
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *apic) Pull() error {
|
func (a *apic) Pull() error {
|
||||||
defer types.CatchPanic("lapi/pullFromAPIC")
|
defer trace.CatchPanic("lapi/pullFromAPIC")
|
||||||
|
|
||||||
toldOnce := false
|
toldOnce := false
|
||||||
for {
|
for {
|
||||||
|
@ -820,7 +824,7 @@ func (a *apic) Pull() error {
|
||||||
|
|
||||||
func (a *apic) GetMetrics() (*models.Metrics, error) {
|
func (a *apic) GetMetrics() (*models.Metrics, error) {
|
||||||
metric := &models.Metrics{
|
metric := &models.Metrics{
|
||||||
ApilVersion: types.StrPtr(cwversion.VersionStr()),
|
ApilVersion: ptr.Of(version.String()),
|
||||||
Machines: make([]*models.MetricsAgentInfo, 0),
|
Machines: make([]*models.MetricsAgentInfo, 0),
|
||||||
Bouncers: make([]*models.MetricsBouncerInfo, 0),
|
Bouncers: make([]*models.MetricsBouncerInfo, 0),
|
||||||
}
|
}
|
||||||
|
@ -861,7 +865,7 @@ func (a *apic) GetMetrics() (*models.Metrics, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *apic) SendMetrics(stop chan (bool)) {
|
func (a *apic) SendMetrics(stop chan (bool)) {
|
||||||
defer types.CatchPanic("lapi/metricsToAPIC")
|
defer trace.CatchPanic("lapi/metricsToAPIC")
|
||||||
|
|
||||||
ticker := time.NewTicker(a.metricsIntervalFirst)
|
ticker := time.NewTicker(a.metricsIntervalFirst)
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,12 @@ import (
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"gopkg.in/tomb.v2"
|
"gopkg.in/tomb.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database/ent/decision"
|
"github.com/crowdsecurity/crowdsec/pkg/database/ent/decision"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database/ent/machine"
|
"github.com/crowdsecurity/crowdsec/pkg/database/ent/machine"
|
||||||
|
@ -59,10 +61,10 @@ func getAPIC(t *testing.T) *apic {
|
||||||
metricsTomb: tomb.Tomb{},
|
metricsTomb: tomb.Tomb{},
|
||||||
scenarioList: make([]string, 0),
|
scenarioList: make([]string, 0),
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareManualDecisions: types.BoolPtr(false),
|
ShareManualDecisions: ptr.Of(false),
|
||||||
ShareTaintedScenarios: types.BoolPtr(false),
|
ShareTaintedScenarios: ptr.Of(false),
|
||||||
ShareCustomScenarios: types.BoolPtr(false),
|
ShareCustomScenarios: ptr.Of(false),
|
||||||
ShareContext: types.BoolPtr(false),
|
ShareContext: ptr.Of(false),
|
||||||
},
|
},
|
||||||
isPulling: make(chan bool, 1),
|
isPulling: make(chan bool, 1),
|
||||||
}
|
}
|
||||||
|
@ -205,7 +207,7 @@ func TestNewAPIC(t *testing.T) {
|
||||||
action: func() {},
|
action: func() {},
|
||||||
args: args{
|
args: args{
|
||||||
dbClient: getDBClient(t),
|
dbClient: getDBClient(t),
|
||||||
consoleConfig: LoadTestConfig().API.Server.ConsoleConfig,
|
consoleConfig: LoadTestConfig(t).API.Server.ConsoleConfig,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -213,7 +215,7 @@ func TestNewAPIC(t *testing.T) {
|
||||||
action: func() { testConfig.Credentials.URL = "foobar http://" },
|
action: func() { testConfig.Credentials.URL = "foobar http://" },
|
||||||
args: args{
|
args: args{
|
||||||
dbClient: getDBClient(t),
|
dbClient: getDBClient(t),
|
||||||
consoleConfig: LoadTestConfig().API.Server.ConsoleConfig,
|
consoleConfig: LoadTestConfig(t).API.Server.ConsoleConfig,
|
||||||
},
|
},
|
||||||
expectedErr: "first path segment in URL cannot contain colon",
|
expectedErr: "first path segment in URL cannot contain colon",
|
||||||
},
|
},
|
||||||
|
@ -265,11 +267,11 @@ func TestAPICHandleDeletedDecisions(t *testing.T) {
|
||||||
assertTotalDecisionCount(t, api.dbClient, 2)
|
assertTotalDecisionCount(t, api.dbClient, 2)
|
||||||
|
|
||||||
nbDeleted, err := api.HandleDeletedDecisions([]*models.Decision{{
|
nbDeleted, err := api.HandleDeletedDecisions([]*models.Decision{{
|
||||||
Value: types.StrPtr("1.2.3.4"),
|
Value: ptr.Of("1.2.3.4"),
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
Type: &decision1.Type,
|
Type: &decision1.Type,
|
||||||
Scenario: types.StrPtr("crowdsec/test"),
|
Scenario: ptr.Of("crowdsec/test"),
|
||||||
Scope: types.StrPtr("IP"),
|
Scope: ptr.Of("IP"),
|
||||||
}}, deleteCounters)
|
}}, deleteCounters)
|
||||||
|
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -293,7 +295,7 @@ func TestAPICGetMetrics(t *testing.T) {
|
||||||
machineIDs: []string{},
|
machineIDs: []string{},
|
||||||
bouncers: []string{},
|
bouncers: []string{},
|
||||||
expectedMetric: &models.Metrics{
|
expectedMetric: &models.Metrics{
|
||||||
ApilVersion: types.StrPtr(cwversion.VersionStr()),
|
ApilVersion: ptr.Of(version.String()),
|
||||||
Bouncers: []*models.MetricsBouncerInfo{},
|
Bouncers: []*models.MetricsBouncerInfo{},
|
||||||
Machines: []*models.MetricsAgentInfo{},
|
Machines: []*models.MetricsAgentInfo{},
|
||||||
},
|
},
|
||||||
|
@ -303,7 +305,7 @@ func TestAPICGetMetrics(t *testing.T) {
|
||||||
machineIDs: []string{"a", "b", "c"},
|
machineIDs: []string{"a", "b", "c"},
|
||||||
bouncers: []string{"1", "2", "3"},
|
bouncers: []string{"1", "2", "3"},
|
||||||
expectedMetric: &models.Metrics{
|
expectedMetric: &models.Metrics{
|
||||||
ApilVersion: types.StrPtr(cwversion.VersionStr()),
|
ApilVersion: ptr.Of(version.String()),
|
||||||
Bouncers: []*models.MetricsBouncerInfo{
|
Bouncers: []*models.MetricsBouncerInfo{
|
||||||
{
|
{
|
||||||
CustomName: "1",
|
CustomName: "1",
|
||||||
|
@ -374,23 +376,23 @@ func TestAPICGetMetrics(t *testing.T) {
|
||||||
|
|
||||||
func TestCreateAlertsForDecision(t *testing.T) {
|
func TestCreateAlertsForDecision(t *testing.T) {
|
||||||
httpBfDecisionList := &models.Decision{
|
httpBfDecisionList := &models.Decision{
|
||||||
Origin: types.StrPtr(types.ListOrigin),
|
Origin: ptr.Of(types.ListOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/http-bf"),
|
Scenario: ptr.Of("crowdsecurity/http-bf"),
|
||||||
}
|
}
|
||||||
|
|
||||||
sshBfDecisionList := &models.Decision{
|
sshBfDecisionList := &models.Decision{
|
||||||
Origin: types.StrPtr(types.ListOrigin),
|
Origin: ptr.Of(types.ListOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/ssh-bf"),
|
Scenario: ptr.Of("crowdsecurity/ssh-bf"),
|
||||||
}
|
}
|
||||||
|
|
||||||
httpBfDecisionCommunity := &models.Decision{
|
httpBfDecisionCommunity := &models.Decision{
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/http-bf"),
|
Scenario: ptr.Of("crowdsecurity/http-bf"),
|
||||||
}
|
}
|
||||||
|
|
||||||
sshBfDecisionCommunity := &models.Decision{
|
sshBfDecisionCommunity := &models.Decision{
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/ssh-bf"),
|
Scenario: ptr.Of("crowdsecurity/ssh-bf"),
|
||||||
}
|
}
|
||||||
type args struct {
|
type args struct {
|
||||||
decisions []*models.Decision
|
decisions []*models.Decision
|
||||||
|
@ -453,27 +455,27 @@ func TestCreateAlertsForDecision(t *testing.T) {
|
||||||
|
|
||||||
func TestFillAlertsWithDecisions(t *testing.T) {
|
func TestFillAlertsWithDecisions(t *testing.T) {
|
||||||
httpBfDecisionCommunity := &models.Decision{
|
httpBfDecisionCommunity := &models.Decision{
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/http-bf"),
|
Scenario: ptr.Of("crowdsecurity/http-bf"),
|
||||||
Scope: types.StrPtr("ip"),
|
Scope: ptr.Of("ip"),
|
||||||
}
|
}
|
||||||
|
|
||||||
sshBfDecisionCommunity := &models.Decision{
|
sshBfDecisionCommunity := &models.Decision{
|
||||||
Origin: types.StrPtr(types.CAPIOrigin),
|
Origin: ptr.Of(types.CAPIOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/ssh-bf"),
|
Scenario: ptr.Of("crowdsecurity/ssh-bf"),
|
||||||
Scope: types.StrPtr("ip"),
|
Scope: ptr.Of("ip"),
|
||||||
}
|
}
|
||||||
|
|
||||||
httpBfDecisionList := &models.Decision{
|
httpBfDecisionList := &models.Decision{
|
||||||
Origin: types.StrPtr(types.ListOrigin),
|
Origin: ptr.Of(types.ListOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/http-bf"),
|
Scenario: ptr.Of("crowdsecurity/http-bf"),
|
||||||
Scope: types.StrPtr("ip"),
|
Scope: ptr.Of("ip"),
|
||||||
}
|
}
|
||||||
|
|
||||||
sshBfDecisionList := &models.Decision{
|
sshBfDecisionList := &models.Decision{
|
||||||
Origin: types.StrPtr(types.ListOrigin),
|
Origin: ptr.Of(types.ListOrigin),
|
||||||
Scenario: types.StrPtr("crowdsecurity/ssh-bf"),
|
Scenario: ptr.Of("crowdsecurity/ssh-bf"),
|
||||||
Scope: types.StrPtr("ip"),
|
Scope: ptr.Of("ip"),
|
||||||
}
|
}
|
||||||
type args struct {
|
type args struct {
|
||||||
alerts []*models.Alert
|
alerts []*models.Alert
|
||||||
|
@ -572,58 +574,58 @@ func TestAPICWhitelists(t *testing.T) {
|
||||||
"9.9.9.9", // This is already present in DB
|
"9.9.9.9", // This is already present in DB
|
||||||
"9.1.9.9", // This not present in DB
|
"9.1.9.9", // This not present in DB
|
||||||
},
|
},
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
}, // This is already present in DB
|
}, // This is already present in DB
|
||||||
},
|
},
|
||||||
New: modelscapi.GetDecisionsStreamResponseNew{
|
New: modelscapi.GetDecisionsStreamResponseNew{
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("13.2.3.4"), //wl by cidr
|
Value: ptr.Of("13.2.3.4"), //wl by cidr
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("2.2.3.4"),
|
Value: ptr.Of("2.2.3.4"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test2"),
|
Scenario: ptr.Of("crowdsecurity/test2"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("13.2.3.5"), //wl by cidr
|
Value: ptr.Of("13.2.3.5"), //wl by cidr
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, // These two are from community list.
|
}, // These two are from community list.
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("6.2.3.4"),
|
Value: ptr.Of("6.2.3.4"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("9.2.3.4"), //wl by ip
|
Value: ptr.Of("9.2.3.4"), //wl by ip
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -631,18 +633,18 @@ func TestAPICWhitelists(t *testing.T) {
|
||||||
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
||||||
Blocklists: []*modelscapi.BlocklistLink{
|
Blocklists: []*modelscapi.BlocklistLink{
|
||||||
{
|
{
|
||||||
URL: types.StrPtr("http://api.crowdsec.net/blocklist1"),
|
URL: ptr.Of("http://api.crowdsec.net/blocklist1"),
|
||||||
Name: types.StrPtr("blocklist1"),
|
Name: ptr.Of("blocklist1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Remediation: types.StrPtr("ban"),
|
Remediation: ptr.Of("ban"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
URL: types.StrPtr("http://api.crowdsec.net/blocklist2"),
|
URL: ptr.Of("http://api.crowdsec.net/blocklist2"),
|
||||||
Name: types.StrPtr("blocklist2"),
|
Name: ptr.Of("blocklist2"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Remediation: types.StrPtr("ban"),
|
Remediation: ptr.Of("ban"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -661,7 +663,7 @@ func TestAPICWhitelists(t *testing.T) {
|
||||||
apic, err := apiclient.NewDefaultClient(
|
apic, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -734,27 +736,27 @@ func TestAPICPullTop(t *testing.T) {
|
||||||
"9.9.9.9", // This is already present in DB
|
"9.9.9.9", // This is already present in DB
|
||||||
"9.1.9.9", // This not present in DB
|
"9.1.9.9", // This not present in DB
|
||||||
},
|
},
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
}, // This is already present in DB
|
}, // This is already present in DB
|
||||||
},
|
},
|
||||||
New: modelscapi.GetDecisionsStreamResponseNew{
|
New: modelscapi.GetDecisionsStreamResponseNew{
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("1.2.3.4"),
|
Value: ptr.Of("1.2.3.4"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test2"),
|
Scenario: ptr.Of("crowdsecurity/test2"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("1.2.3.5"),
|
Value: ptr.Of("1.2.3.5"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}, // These two are from community list.
|
}, // These two are from community list.
|
||||||
|
@ -762,18 +764,18 @@ func TestAPICPullTop(t *testing.T) {
|
||||||
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
||||||
Blocklists: []*modelscapi.BlocklistLink{
|
Blocklists: []*modelscapi.BlocklistLink{
|
||||||
{
|
{
|
||||||
URL: types.StrPtr("http://api.crowdsec.net/blocklist1"),
|
URL: ptr.Of("http://api.crowdsec.net/blocklist1"),
|
||||||
Name: types.StrPtr("blocklist1"),
|
Name: ptr.Of("blocklist1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Remediation: types.StrPtr("ban"),
|
Remediation: ptr.Of("ban"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
URL: types.StrPtr("http://api.crowdsec.net/blocklist2"),
|
URL: ptr.Of("http://api.crowdsec.net/blocklist2"),
|
||||||
Name: types.StrPtr("blocklist2"),
|
Name: ptr.Of("blocklist2"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Remediation: types.StrPtr("ban"),
|
Remediation: ptr.Of("ban"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -792,7 +794,7 @@ func TestAPICPullTop(t *testing.T) {
|
||||||
apic, err := apiclient.NewDefaultClient(
|
apic, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -840,12 +842,12 @@ func TestAPICPullTopBLCacheFirstCall(t *testing.T) {
|
||||||
modelscapi.GetDecisionsStreamResponse{
|
modelscapi.GetDecisionsStreamResponse{
|
||||||
New: modelscapi.GetDecisionsStreamResponseNew{
|
New: modelscapi.GetDecisionsStreamResponseNew{
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("1.2.3.4"),
|
Value: ptr.Of("1.2.3.4"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -853,11 +855,11 @@ func TestAPICPullTopBLCacheFirstCall(t *testing.T) {
|
||||||
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
||||||
Blocklists: []*modelscapi.BlocklistLink{
|
Blocklists: []*modelscapi.BlocklistLink{
|
||||||
{
|
{
|
||||||
URL: types.StrPtr("http://api.crowdsec.net/blocklist1"),
|
URL: ptr.Of("http://api.crowdsec.net/blocklist1"),
|
||||||
Name: types.StrPtr("blocklist1"),
|
Name: ptr.Of("blocklist1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Remediation: types.StrPtr("ban"),
|
Remediation: ptr.Of("ban"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -874,7 +876,7 @@ func TestAPICPullTopBLCacheFirstCall(t *testing.T) {
|
||||||
apic, err := apiclient.NewDefaultClient(
|
apic, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -883,7 +885,7 @@ func TestAPICPullTopBLCacheFirstCall(t *testing.T) {
|
||||||
err = api.PullTop(false)
|
err = api.PullTop(false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
blocklistConfigItemName := fmt.Sprintf("blocklist:%s:last_pull", *types.StrPtr("blocklist1"))
|
blocklistConfigItemName := "blocklist:blocklist1:last_pull"
|
||||||
lastPullTimestamp, err := api.dbClient.GetConfigItem(blocklistConfigItemName)
|
lastPullTimestamp, err := api.dbClient.GetConfigItem(blocklistConfigItemName)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.NotEqual(t, "", *lastPullTimestamp)
|
assert.NotEqual(t, "", *lastPullTimestamp)
|
||||||
|
@ -927,12 +929,12 @@ func TestAPICPullTopBLCacheForceCall(t *testing.T) {
|
||||||
modelscapi.GetDecisionsStreamResponse{
|
modelscapi.GetDecisionsStreamResponse{
|
||||||
New: modelscapi.GetDecisionsStreamResponseNew{
|
New: modelscapi.GetDecisionsStreamResponseNew{
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/test1"),
|
Scenario: ptr.Of("crowdsecurity/test1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("1.2.3.4"),
|
Value: ptr.Of("1.2.3.4"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -940,11 +942,11 @@ func TestAPICPullTopBLCacheForceCall(t *testing.T) {
|
||||||
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
Links: &modelscapi.GetDecisionsStreamResponseLinks{
|
||||||
Blocklists: []*modelscapi.BlocklistLink{
|
Blocklists: []*modelscapi.BlocklistLink{
|
||||||
{
|
{
|
||||||
URL: types.StrPtr("http://api.crowdsec.net/blocklist1"),
|
URL: ptr.Of("http://api.crowdsec.net/blocklist1"),
|
||||||
Name: types.StrPtr("blocklist1"),
|
Name: ptr.Of("blocklist1"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Remediation: types.StrPtr("ban"),
|
Remediation: ptr.Of("ban"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -961,7 +963,7 @@ func TestAPICPullTopBLCacheForceCall(t *testing.T) {
|
||||||
apic, err := apiclient.NewDefaultClient(
|
apic, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -981,10 +983,10 @@ func TestAPICPush(t *testing.T) {
|
||||||
name: "simple single alert",
|
name: "simple single alert",
|
||||||
alerts: []*models.Alert{
|
alerts: []*models.Alert{
|
||||||
{
|
{
|
||||||
Scenario: types.StrPtr("crowdsec/test"),
|
Scenario: ptr.Of("crowdsec/test"),
|
||||||
ScenarioHash: types.StrPtr("certified"),
|
ScenarioHash: ptr.Of("certified"),
|
||||||
ScenarioVersion: types.StrPtr("v1.0"),
|
ScenarioVersion: ptr.Of("v1.0"),
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
Source: &models.Source{},
|
Source: &models.Source{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -994,10 +996,10 @@ func TestAPICPush(t *testing.T) {
|
||||||
name: "simulated alert is not pushed",
|
name: "simulated alert is not pushed",
|
||||||
alerts: []*models.Alert{
|
alerts: []*models.Alert{
|
||||||
{
|
{
|
||||||
Scenario: types.StrPtr("crowdsec/test"),
|
Scenario: ptr.Of("crowdsec/test"),
|
||||||
ScenarioHash: types.StrPtr("certified"),
|
ScenarioHash: ptr.Of("certified"),
|
||||||
ScenarioVersion: types.StrPtr("v1.0"),
|
ScenarioVersion: ptr.Of("v1.0"),
|
||||||
Simulated: types.BoolPtr(true),
|
Simulated: ptr.Of(true),
|
||||||
Source: &models.Source{},
|
Source: &models.Source{},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -1010,10 +1012,10 @@ func TestAPICPush(t *testing.T) {
|
||||||
alerts := make([]*models.Alert, 100)
|
alerts := make([]*models.Alert, 100)
|
||||||
for i := 0; i < 100; i++ {
|
for i := 0; i < 100; i++ {
|
||||||
alerts[i] = &models.Alert{
|
alerts[i] = &models.Alert{
|
||||||
Scenario: types.StrPtr("crowdsec/test"),
|
Scenario: ptr.Of("crowdsec/test"),
|
||||||
ScenarioHash: types.StrPtr("certified"),
|
ScenarioHash: ptr.Of("certified"),
|
||||||
ScenarioVersion: types.StrPtr("v1.0"),
|
ScenarioVersion: ptr.Of("v1.0"),
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
Source: &models.Source{},
|
Source: &models.Source{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1036,7 +1038,7 @@ func TestAPICPush(t *testing.T) {
|
||||||
apic, err := apiclient.NewDefaultClient(
|
apic, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -1111,7 +1113,7 @@ func TestAPICSendMetrics(t *testing.T) {
|
||||||
apiClient, err := apiclient.NewDefaultClient(
|
apiClient, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -1179,7 +1181,7 @@ func TestAPICPull(t *testing.T) {
|
||||||
apic, err := apiclient.NewDefaultClient(
|
apic, err := apiclient.NewDefaultClient(
|
||||||
url,
|
url,
|
||||||
"/api",
|
"/api",
|
||||||
fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
|
fmt.Sprintf("crowdsec/%s", version.String()),
|
||||||
nil,
|
nil,
|
||||||
)
|
)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -1188,12 +1190,12 @@ func TestAPICPull(t *testing.T) {
|
||||||
modelscapi.GetDecisionsStreamResponse{
|
modelscapi.GetDecisionsStreamResponse{
|
||||||
New: modelscapi.GetDecisionsStreamResponseNew{
|
New: modelscapi.GetDecisionsStreamResponseNew{
|
||||||
&modelscapi.GetDecisionsStreamResponseNewItem{
|
&modelscapi.GetDecisionsStreamResponseNewItem{
|
||||||
Scenario: types.StrPtr("crowdsecurity/ssh-bf"),
|
Scenario: ptr.Of("crowdsecurity/ssh-bf"),
|
||||||
Scope: types.StrPtr("Ip"),
|
Scope: ptr.Of("Ip"),
|
||||||
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
Decisions: []*modelscapi.GetDecisionsStreamResponseNewItemDecisionsItems0{
|
||||||
{
|
{
|
||||||
Value: types.StrPtr("1.2.3.5"),
|
Value: ptr.Of("1.2.3.5"),
|
||||||
Duration: types.StrPtr("24h"),
|
Duration: ptr.Of("24h"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -1228,29 +1230,29 @@ func TestShouldShareAlert(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "custom alert should be shared if config enables it",
|
name: "custom alert should be shared if config enables it",
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareCustomScenarios: types.BoolPtr(true),
|
ShareCustomScenarios: ptr.Of(true),
|
||||||
},
|
},
|
||||||
alert: &models.Alert{Simulated: types.BoolPtr(false)},
|
alert: &models.Alert{Simulated: ptr.Of(false)},
|
||||||
expectedRet: true,
|
expectedRet: true,
|
||||||
expectedTrust: "custom",
|
expectedTrust: "custom",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "custom alert should not be shared if config disables it",
|
name: "custom alert should not be shared if config disables it",
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareCustomScenarios: types.BoolPtr(false),
|
ShareCustomScenarios: ptr.Of(false),
|
||||||
},
|
},
|
||||||
alert: &models.Alert{Simulated: types.BoolPtr(false)},
|
alert: &models.Alert{Simulated: ptr.Of(false)},
|
||||||
expectedRet: false,
|
expectedRet: false,
|
||||||
expectedTrust: "custom",
|
expectedTrust: "custom",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "manual alert should be shared if config enables it",
|
name: "manual alert should be shared if config enables it",
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareManualDecisions: types.BoolPtr(true),
|
ShareManualDecisions: ptr.Of(true),
|
||||||
},
|
},
|
||||||
alert: &models.Alert{
|
alert: &models.Alert{
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
Decisions: []*models.Decision{{Origin: types.StrPtr(types.CscliOrigin)}},
|
Decisions: []*models.Decision{{Origin: ptr.Of(types.CscliOrigin)}},
|
||||||
},
|
},
|
||||||
expectedRet: true,
|
expectedRet: true,
|
||||||
expectedTrust: "manual",
|
expectedTrust: "manual",
|
||||||
|
@ -1258,11 +1260,11 @@ func TestShouldShareAlert(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "manual alert should not be shared if config disables it",
|
name: "manual alert should not be shared if config disables it",
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareManualDecisions: types.BoolPtr(false),
|
ShareManualDecisions: ptr.Of(false),
|
||||||
},
|
},
|
||||||
alert: &models.Alert{
|
alert: &models.Alert{
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
Decisions: []*models.Decision{{Origin: types.StrPtr(types.CscliOrigin)}},
|
Decisions: []*models.Decision{{Origin: ptr.Of(types.CscliOrigin)}},
|
||||||
},
|
},
|
||||||
expectedRet: false,
|
expectedRet: false,
|
||||||
expectedTrust: "manual",
|
expectedTrust: "manual",
|
||||||
|
@ -1270,11 +1272,11 @@ func TestShouldShareAlert(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "manual alert should be shared if config enables it",
|
name: "manual alert should be shared if config enables it",
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareTaintedScenarios: types.BoolPtr(true),
|
ShareTaintedScenarios: ptr.Of(true),
|
||||||
},
|
},
|
||||||
alert: &models.Alert{
|
alert: &models.Alert{
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
ScenarioHash: types.StrPtr("whateverHash"),
|
ScenarioHash: ptr.Of("whateverHash"),
|
||||||
},
|
},
|
||||||
expectedRet: true,
|
expectedRet: true,
|
||||||
expectedTrust: "tainted",
|
expectedTrust: "tainted",
|
||||||
|
@ -1282,11 +1284,11 @@ func TestShouldShareAlert(t *testing.T) {
|
||||||
{
|
{
|
||||||
name: "manual alert should not be shared if config disables it",
|
name: "manual alert should not be shared if config disables it",
|
||||||
consoleConfig: &csconfig.ConsoleConfig{
|
consoleConfig: &csconfig.ConsoleConfig{
|
||||||
ShareTaintedScenarios: types.BoolPtr(false),
|
ShareTaintedScenarios: ptr.Of(false),
|
||||||
},
|
},
|
||||||
alert: &models.Alert{
|
alert: &models.Alert{
|
||||||
Simulated: types.BoolPtr(false),
|
Simulated: ptr.Of(false),
|
||||||
ScenarioHash: types.StrPtr("whateverHash"),
|
ScenarioHash: ptr.Of("whateverHash"),
|
||||||
},
|
},
|
||||||
expectedRet: false,
|
expectedRet: false,
|
||||||
expectedTrust: "tainted",
|
expectedTrust: "tainted",
|
||||||
|
|
|
@ -12,6 +12,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiserver/controllers"
|
"github.com/crowdsecurity/crowdsec/pkg/apiserver/controllers"
|
||||||
v1 "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
|
v1 "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
|
||||||
|
@ -87,7 +89,7 @@ func CustomRecoveryWithWriter() gin.HandlerFunc {
|
||||||
log.Warningf("client %s disconnected : %s", c.ClientIP(), err)
|
log.Warningf("client %s disconnected : %s", c.ClientIP(), err)
|
||||||
c.Abort()
|
c.Abort()
|
||||||
} else {
|
} else {
|
||||||
filename := types.WriteStackTrace(err)
|
filename := trace.WriteStackTrace(err)
|
||||||
log.Warningf("client %s error : %s", c.ClientIP(), err)
|
log.Warningf("client %s error : %s", c.ClientIP(), err)
|
||||||
log.Warningf("stacktrace written to %s, please join to your issue", filename)
|
log.Warningf("stacktrace written to %s, please join to your issue", filename)
|
||||||
c.AbortWithStatus(http.StatusInternalServerError)
|
c.AbortWithStatus(http.StatusInternalServerError)
|
||||||
|
@ -311,7 +313,13 @@ func (s *APIServer) GetTLSConfig() (*tls.Config, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "Error opening cert file")
|
return nil, errors.Wrap(err, "Error opening cert file")
|
||||||
}
|
}
|
||||||
|
caCertPool, err = x509.SystemCertPool()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Error loading system CA certificates: %s", err)
|
||||||
|
}
|
||||||
|
if caCertPool == nil {
|
||||||
caCertPool = x509.NewCertPool()
|
caCertPool = x509.NewCertPool()
|
||||||
|
}
|
||||||
caCertPool.AppendCertsFromPEM(caCert)
|
caCertPool.AppendCertsFromPEM(caCert)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,7 +333,7 @@ func (s *APIServer) GetTLSConfig() (*tls.Config, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *APIServer) Run(apiReady chan bool) error {
|
func (s *APIServer) Run(apiReady chan bool) error {
|
||||||
defer types.CatchPanic("lapi/runServer")
|
defer trace.CatchPanic("lapi/runServer")
|
||||||
tlsCfg, err := s.GetTLSConfig()
|
tlsCfg, err := s.GetTLSConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "while creating TLS config")
|
return errors.Wrap(err, "while creating TLS config")
|
||||||
|
|
|
@ -11,8 +11,9 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/version"
|
||||||
|
|
||||||
middlewares "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
|
middlewares "github.com/crowdsecurity/crowdsec/pkg/apiserver/middlewares/v1"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cwversion"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
"github.com/go-openapi/strfmt"
|
"github.com/go-openapi/strfmt"
|
||||||
|
@ -33,16 +34,19 @@ var MachineTest = models.WatcherAuthRequest{
|
||||||
Password: &testPassword,
|
Password: &testPassword,
|
||||||
}
|
}
|
||||||
|
|
||||||
var UserAgent = fmt.Sprintf("crowdsec-test/%s", cwversion.Version)
|
var UserAgent = fmt.Sprintf("crowdsec-test/%s", version.Version)
|
||||||
var emptyBody = strings.NewReader("")
|
var emptyBody = strings.NewReader("")
|
||||||
|
|
||||||
func LoadTestConfig() csconfig.Config {
|
func LoadTestConfig(t *testing.T) csconfig.Config {
|
||||||
config := csconfig.Config{}
|
config := csconfig.Config{}
|
||||||
maxAge := "1h"
|
maxAge := "1h"
|
||||||
flushConfig := csconfig.FlushDBCfg{
|
flushConfig := csconfig.FlushDBCfg{
|
||||||
MaxAge: &maxAge,
|
MaxAge: &maxAge,
|
||||||
}
|
}
|
||||||
|
|
||||||
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
||||||
|
t.Cleanup(func() { os.RemoveAll(tempDir) })
|
||||||
|
|
||||||
dbconfig := csconfig.DatabaseCfg{
|
dbconfig := csconfig.DatabaseCfg{
|
||||||
Type: "sqlite",
|
Type: "sqlite",
|
||||||
DbPath: filepath.Join(tempDir, "ent"),
|
DbPath: filepath.Join(tempDir, "ent"),
|
||||||
|
@ -68,13 +72,16 @@ func LoadTestConfig() csconfig.Config {
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
func LoadTestConfigForwardedFor() csconfig.Config {
|
func LoadTestConfigForwardedFor(t *testing.T) csconfig.Config {
|
||||||
config := csconfig.Config{}
|
config := csconfig.Config{}
|
||||||
maxAge := "1h"
|
maxAge := "1h"
|
||||||
flushConfig := csconfig.FlushDBCfg{
|
flushConfig := csconfig.FlushDBCfg{
|
||||||
MaxAge: &maxAge,
|
MaxAge: &maxAge,
|
||||||
}
|
}
|
||||||
|
|
||||||
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
||||||
|
t.Cleanup(func() { os.RemoveAll(tempDir) })
|
||||||
|
|
||||||
dbconfig := csconfig.DatabaseCfg{
|
dbconfig := csconfig.DatabaseCfg{
|
||||||
Type: "sqlite",
|
Type: "sqlite",
|
||||||
DbPath: filepath.Join(tempDir, "ent"),
|
DbPath: filepath.Join(tempDir, "ent"),
|
||||||
|
@ -102,8 +109,8 @@ func LoadTestConfigForwardedFor() csconfig.Config {
|
||||||
return config
|
return config
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAPIServer() (*APIServer, csconfig.Config, error) {
|
func NewAPIServer(t *testing.T) (*APIServer, csconfig.Config, error) {
|
||||||
config := LoadTestConfig()
|
config := LoadTestConfig(t)
|
||||||
os.Remove("./ent")
|
os.Remove("./ent")
|
||||||
apiServer, err := NewServer(config.API.Server)
|
apiServer, err := NewServer(config.API.Server)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -114,8 +121,8 @@ func NewAPIServer() (*APIServer, csconfig.Config, error) {
|
||||||
return apiServer, config, nil
|
return apiServer, config, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAPITest() (*gin.Engine, csconfig.Config, error) {
|
func NewAPITest(t *testing.T) (*gin.Engine, csconfig.Config, error) {
|
||||||
apiServer, config, err := NewAPIServer()
|
apiServer, config, err := NewAPIServer(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, config, fmt.Errorf("unable to run local API: %s", err)
|
return nil, config, fmt.Errorf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -130,8 +137,8 @@ func NewAPITest() (*gin.Engine, csconfig.Config, error) {
|
||||||
return router, config, nil
|
return router, config, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAPITestForwardedFor() (*gin.Engine, csconfig.Config, error) {
|
func NewAPITestForwardedFor(t *testing.T) (*gin.Engine, csconfig.Config, error) {
|
||||||
config := LoadTestConfigForwardedFor()
|
config := LoadTestConfigForwardedFor(t)
|
||||||
|
|
||||||
os.Remove("./ent")
|
os.Remove("./ent")
|
||||||
apiServer, err := NewServer(config.API.Server)
|
apiServer, err := NewServer(config.API.Server)
|
||||||
|
@ -284,7 +291,7 @@ func CreateTestBouncer(config *csconfig.DatabaseCfg) (string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWithWrongDBConfig(t *testing.T) {
|
func TestWithWrongDBConfig(t *testing.T) {
|
||||||
config := LoadTestConfig()
|
config := LoadTestConfig(t)
|
||||||
config.API.Server.DbConfig.Type = "test"
|
config.API.Server.DbConfig.Type = "test"
|
||||||
apiServer, err := NewServer(config.API.Server)
|
apiServer, err := NewServer(config.API.Server)
|
||||||
|
|
||||||
|
@ -293,7 +300,7 @@ func TestWithWrongDBConfig(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWithWrongFlushConfig(t *testing.T) {
|
func TestWithWrongFlushConfig(t *testing.T) {
|
||||||
config := LoadTestConfig()
|
config := LoadTestConfig(t)
|
||||||
maxItems := -1
|
maxItems := -1
|
||||||
config.API.Server.DbConfig.Flush.MaxItems = &maxItems
|
config.API.Server.DbConfig.Flush.MaxItems = &maxItems
|
||||||
apiServer, err := NewServer(config.API.Server)
|
apiServer, err := NewServer(config.API.Server)
|
||||||
|
@ -303,7 +310,7 @@ func TestWithWrongFlushConfig(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUnknownPath(t *testing.T) {
|
func TestUnknownPath(t *testing.T) {
|
||||||
router, _, err := NewAPITest()
|
router, _, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -333,13 +340,15 @@ ListenURI string `yaml:"listen_uri,omitempty"` //127.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
func TestLoggingDebugToFileConfig(t *testing.T) {
|
func TestLoggingDebugToFileConfig(t *testing.T) {
|
||||||
|
|
||||||
/*declare settings*/
|
/*declare settings*/
|
||||||
maxAge := "1h"
|
maxAge := "1h"
|
||||||
flushConfig := csconfig.FlushDBCfg{
|
flushConfig := csconfig.FlushDBCfg{
|
||||||
MaxAge: &maxAge,
|
MaxAge: &maxAge,
|
||||||
}
|
}
|
||||||
|
|
||||||
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
||||||
|
t.Cleanup(func() { os.RemoveAll(tempDir) })
|
||||||
|
|
||||||
dbconfig := csconfig.DatabaseCfg{
|
dbconfig := csconfig.DatabaseCfg{
|
||||||
Type: "sqlite",
|
Type: "sqlite",
|
||||||
DbPath: filepath.Join(tempDir, "ent"),
|
DbPath: filepath.Join(tempDir, "ent"),
|
||||||
|
@ -397,7 +406,10 @@ func TestLoggingErrorToFileConfig(t *testing.T) {
|
||||||
flushConfig := csconfig.FlushDBCfg{
|
flushConfig := csconfig.FlushDBCfg{
|
||||||
MaxAge: &maxAge,
|
MaxAge: &maxAge,
|
||||||
}
|
}
|
||||||
|
|
||||||
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
tempDir, _ := os.MkdirTemp("", "crowdsec_tests")
|
||||||
|
t.Cleanup(func() { os.RemoveAll(tempDir) })
|
||||||
|
|
||||||
dbconfig := csconfig.DatabaseCfg{
|
dbconfig := csconfig.DatabaseCfg{
|
||||||
Type: "sqlite",
|
Type: "sqlite",
|
||||||
DbPath: filepath.Join(tempDir, "ent"),
|
DbPath: filepath.Join(tempDir, "ent"),
|
||||||
|
|
|
@ -11,7 +11,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLogin(t *testing.T) {
|
func TestLogin(t *testing.T) {
|
||||||
router, config, err := NewAPITest()
|
router, config, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateMachine(t *testing.T) {
|
func TestCreateMachine(t *testing.T) {
|
||||||
router, _, err := NewAPITest()
|
router, _, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ func TestCreateMachine(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateMachineWithForwardedFor(t *testing.T) {
|
func TestCreateMachineWithForwardedFor(t *testing.T) {
|
||||||
router, config, err := NewAPITestForwardedFor()
|
router, config, err := NewAPITestForwardedFor(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ func TestCreateMachineWithForwardedFor(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateMachineWithForwardedForNoConfig(t *testing.T) {
|
func TestCreateMachineWithForwardedForNoConfig(t *testing.T) {
|
||||||
router, config, err := NewAPITest()
|
router, config, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -113,7 +113,7 @@ func TestCreateMachineWithForwardedForNoConfig(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateMachineWithoutForwardedFor(t *testing.T) {
|
func TestCreateMachineWithoutForwardedFor(t *testing.T) {
|
||||||
router, config, err := NewAPITestForwardedFor()
|
router, config, err := NewAPITestForwardedFor(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -143,7 +143,7 @@ func TestCreateMachineWithoutForwardedFor(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateMachineAlreadyExist(t *testing.T) {
|
func TestCreateMachineAlreadyExist(t *testing.T) {
|
||||||
router, _, err := NewAPITest()
|
router, _, err := NewAPITest(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("unable to run local API: %s", err)
|
log.Fatalf("unable to run local API: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ import (
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/trace"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/database"
|
"github.com/crowdsecurity/crowdsec/pkg/database"
|
||||||
|
@ -217,8 +219,7 @@ func (p *Papi) PullOnce(since time.Time, sync bool) error {
|
||||||
|
|
||||||
// PullPAPI is the long polling client for real-time decisions from PAPI
|
// PullPAPI is the long polling client for real-time decisions from PAPI
|
||||||
func (p *Papi) Pull() error {
|
func (p *Papi) Pull() error {
|
||||||
|
defer trace.CatchPanic("lapi/PullPAPI")
|
||||||
defer types.CatchPanic("lapi/PullPAPI")
|
|
||||||
p.Logger.Infof("Starting Polling API Pull")
|
p.Logger.Infof("Starting Polling API Pull")
|
||||||
|
|
||||||
lastTimestamp := time.Time{}
|
lastTimestamp := time.Time{}
|
||||||
|
@ -270,7 +271,7 @@ func (p *Papi) Pull() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Papi) SyncDecisions() error {
|
func (p *Papi) SyncDecisions() error {
|
||||||
defer types.CatchPanic("lapi/syncDecisionsToCAPI")
|
defer trace.CatchPanic("lapi/syncDecisionsToCAPI")
|
||||||
|
|
||||||
var cache models.DecisionsDeleteRequest
|
var cache models.DecisionsDeleteRequest
|
||||||
ticker := time.NewTicker(p.SyncInterval)
|
ticker := time.NewTicker(p.SyncInterval)
|
||||||
|
|
|
@ -5,11 +5,13 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/models"
|
"github.com/crowdsecurity/crowdsec/pkg/models"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
||||||
"github.com/pkg/errors"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type deleteDecisions struct {
|
type deleteDecisions struct {
|
||||||
|
@ -75,7 +77,7 @@ func AlertCmd(message *Message, p *Papi, sync bool) error {
|
||||||
alert := &models.Alert{}
|
alert := &models.Alert{}
|
||||||
|
|
||||||
if err := json.Unmarshal(data, alert); err != nil {
|
if err := json.Unmarshal(data, alert); err != nil {
|
||||||
return errors.Wrapf(err, "message for '%s' contains bad alert format", message.Header.OperationType)
|
return fmt.Errorf("message for '%s' contains bad alert format: %w", message.Header.OperationType, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Infof("Received order %s from PAPI (%d decisions)", alert.UUID, len(alert.Decisions))
|
log.Infof("Received order %s from PAPI (%d decisions)", alert.UUID, len(alert.Decisions))
|
||||||
|
@ -83,20 +85,20 @@ func AlertCmd(message *Message, p *Papi, sync bool) error {
|
||||||
/*Fix the alert with missing mandatory items*/
|
/*Fix the alert with missing mandatory items*/
|
||||||
if alert.StartAt == nil || *alert.StartAt == "" {
|
if alert.StartAt == nil || *alert.StartAt == "" {
|
||||||
log.Warnf("Alert %d has no StartAt, setting it to now", alert.ID)
|
log.Warnf("Alert %d has no StartAt, setting it to now", alert.ID)
|
||||||
alert.StartAt = types.StrPtr(time.Now().UTC().Format(time.RFC3339))
|
alert.StartAt = ptr.Of(time.Now().UTC().Format(time.RFC3339))
|
||||||
}
|
}
|
||||||
if alert.StopAt == nil || *alert.StopAt == "" {
|
if alert.StopAt == nil || *alert.StopAt == "" {
|
||||||
log.Warnf("Alert %d has no StopAt, setting it to now", alert.ID)
|
log.Warnf("Alert %d has no StopAt, setting it to now", alert.ID)
|
||||||
alert.StopAt = types.StrPtr(time.Now().UTC().Format(time.RFC3339))
|
alert.StopAt = ptr.Of(time.Now().UTC().Format(time.RFC3339))
|
||||||
}
|
}
|
||||||
alert.EventsCount = types.Int32Ptr(0)
|
alert.EventsCount = ptr.Of(int32(0))
|
||||||
alert.Capacity = types.Int32Ptr(0)
|
alert.Capacity = ptr.Of(int32(0))
|
||||||
alert.Leakspeed = types.StrPtr("")
|
alert.Leakspeed = ptr.Of("")
|
||||||
alert.Simulated = types.BoolPtr(false)
|
alert.Simulated = ptr.Of(false)
|
||||||
alert.ScenarioHash = types.StrPtr("")
|
alert.ScenarioHash = ptr.Of("")
|
||||||
alert.ScenarioVersion = types.StrPtr("")
|
alert.ScenarioVersion = ptr.Of("")
|
||||||
alert.Message = types.StrPtr("")
|
alert.Message = ptr.Of("")
|
||||||
alert.Scenario = types.StrPtr("")
|
alert.Scenario = ptr.Of("")
|
||||||
alert.Source = &models.Source{}
|
alert.Source = &models.Source{}
|
||||||
|
|
||||||
//if we're setting Source.Scope to types.ConsoleOrigin, it messes up the alert's value
|
//if we're setting Source.Scope to types.ConsoleOrigin, it messes up the alert's value
|
||||||
|
@ -105,7 +107,7 @@ func AlertCmd(message *Message, p *Papi, sync bool) error {
|
||||||
alert.Source.Value = alert.Decisions[0].Value
|
alert.Source.Value = alert.Decisions[0].Value
|
||||||
} else {
|
} else {
|
||||||
log.Warningf("No decision found in alert for Polling API (%s : %s)", message.Header.Source.User, message.Header.Message)
|
log.Warningf("No decision found in alert for Polling API (%s : %s)", message.Header.Source.User, message.Header.Message)
|
||||||
alert.Source.Scope = types.StrPtr(types.ConsoleOrigin)
|
alert.Source.Scope = ptr.Of(types.ConsoleOrigin)
|
||||||
alert.Source.Value = &message.Header.Source.User
|
alert.Source.Value = &message.Header.Source.User
|
||||||
}
|
}
|
||||||
alert.Scenario = &message.Header.Message
|
alert.Scenario = &message.Header.Message
|
||||||
|
|
|
@ -9,13 +9,13 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/yamlpatch"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
"github.com/crowdsecurity/crowdsec/pkg/apiclient"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/yamlpatch"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type APICfg struct {
|
type APICfg struct {
|
||||||
|
@ -82,11 +82,11 @@ func (o *OnlineApiClientCfg) Load() error {
|
||||||
o.Credentials = new(ApiCredentialsCfg)
|
o.Credentials = new(ApiCredentialsCfg)
|
||||||
fcontent, err := os.ReadFile(o.CredentialsFilePath)
|
fcontent, err := os.ReadFile(o.CredentialsFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to read api server credentials configuration file '%s'", o.CredentialsFilePath)
|
return fmt.Errorf("failed to read api server credentials configuration file '%s': %w", o.CredentialsFilePath, err)
|
||||||
}
|
}
|
||||||
err = yaml.UnmarshalStrict(fcontent, o.Credentials)
|
err = yaml.UnmarshalStrict(fcontent, o.Credentials)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed unmarshaling api server credentials configuration file '%s'", o.CredentialsFilePath)
|
return fmt.Errorf("failed unmarshaling api server credentials configuration file '%s': %w", o.CredentialsFilePath, err)
|
||||||
}
|
}
|
||||||
if o.Credentials.Login == "" || o.Credentials.Password == "" || o.Credentials.URL == "" {
|
if o.Credentials.Login == "" || o.Credentials.Password == "" || o.Credentials.URL == "" {
|
||||||
log.Warningf("can't load CAPI credentials from '%s' (missing field)", o.CredentialsFilePath)
|
log.Warningf("can't load CAPI credentials from '%s' (missing field)", o.CredentialsFilePath)
|
||||||
|
@ -104,7 +104,7 @@ func (l *LocalApiClientCfg) Load() error {
|
||||||
}
|
}
|
||||||
err = yaml.UnmarshalStrict(fcontent, &l.Credentials)
|
err = yaml.UnmarshalStrict(fcontent, &l.Credentials)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed unmarshaling api client credential configuration file '%s'", l.CredentialsFilePath)
|
return fmt.Errorf("failed unmarshaling api client credential configuration file '%s': %w", l.CredentialsFilePath, err)
|
||||||
}
|
}
|
||||||
if l.Credentials == nil || l.Credentials.URL == "" {
|
if l.Credentials == nil || l.Credentials.URL == "" {
|
||||||
return fmt.Errorf("no credentials or URL found in api client configuration '%s'", l.CredentialsFilePath)
|
return fmt.Errorf("no credentials or URL found in api client configuration '%s'", l.CredentialsFilePath)
|
||||||
|
@ -129,10 +129,16 @@ func (l *LocalApiClientCfg) Load() error {
|
||||||
if l.Credentials.CACertPath != "" {
|
if l.Credentials.CACertPath != "" {
|
||||||
caCert, err := os.ReadFile(l.Credentials.CACertPath)
|
caCert, err := os.ReadFile(l.Credentials.CACertPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to load cacert")
|
return fmt.Errorf("failed to load cacert: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
caCertPool := x509.NewCertPool()
|
caCertPool, err := x509.SystemCertPool()
|
||||||
|
if err != nil {
|
||||||
|
log.Warningf("Error loading system CA certificates: %s", err)
|
||||||
|
}
|
||||||
|
if caCertPool == nil {
|
||||||
|
caCertPool = x509.NewCertPool()
|
||||||
|
}
|
||||||
caCertPool.AppendCertsFromPEM(caCert)
|
caCertPool.AppendCertsFromPEM(caCert)
|
||||||
apiclient.CaCertPool = caCertPool
|
apiclient.CaCertPool = caCertPool
|
||||||
}
|
}
|
||||||
|
@ -140,7 +146,7 @@ func (l *LocalApiClientCfg) Load() error {
|
||||||
if l.Credentials.CertPath != "" && l.Credentials.KeyPath != "" {
|
if l.Credentials.CertPath != "" && l.Credentials.KeyPath != "" {
|
||||||
cert, err := tls.LoadX509KeyPair(l.Credentials.CertPath, l.Credentials.KeyPath)
|
cert, err := tls.LoadX509KeyPair(l.Credentials.CertPath, l.Credentials.KeyPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to load api client certificate")
|
return fmt.Errorf("failed to load api client certificate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
apiclient.Cert = &cert
|
apiclient.Cert = &cert
|
||||||
|
@ -222,7 +228,11 @@ func (c *Config) LoadAPIServer() error {
|
||||||
log.Warning("crowdsec local API is disabled from flag")
|
log.Warning("crowdsec local API is disabled from flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.API.Server != nil {
|
if c.API.Server == nil {
|
||||||
|
log.Warning("crowdsec local API is disabled")
|
||||||
|
c.DisableAPI = true
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
//inherit log level from common, then api->server
|
//inherit log level from common, then api->server
|
||||||
var logLevel log.Level
|
var logLevel log.Level
|
||||||
|
@ -240,7 +250,7 @@ func (c *Config) LoadAPIServer() error {
|
||||||
|
|
||||||
if c.API.Server.OnlineClient != nil && c.API.Server.OnlineClient.CredentialsFilePath != "" {
|
if c.API.Server.OnlineClient != nil && c.API.Server.OnlineClient.CredentialsFilePath != "" {
|
||||||
if err := c.API.Server.OnlineClient.Load(); err != nil {
|
if err := c.API.Server.OnlineClient.Load(); err != nil {
|
||||||
return errors.Wrap(err, "loading online client credentials")
|
return fmt.Errorf("loading online client credentials: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if c.API.Server.OnlineClient == nil || c.API.Server.OnlineClient.Credentials == nil {
|
if c.API.Server.OnlineClient == nil || c.API.Server.OnlineClient.Credentials == nil {
|
||||||
|
@ -254,15 +264,13 @@ func (c *Config) LoadAPIServer() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
if c.API.Server.CapiWhitelistsPath != "" {
|
||||||
log.Warning("crowdsec local API is disabled")
|
log.Infof("loaded capi whitelist from %s: %d IPs, %d CIDRs", c.API.Server.CapiWhitelistsPath, len(c.API.Server.CapiWhitelists.Ips), len(c.API.Server.CapiWhitelists.Cidrs))
|
||||||
c.DisableAPI = true
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.API.Server.Enable == nil {
|
if c.API.Server.Enable == nil {
|
||||||
// if the option is not present, it is enabled by default
|
// if the option is not present, it is enabled by default
|
||||||
c.API.Server.Enable = types.BoolPtr(true)
|
c.API.Server.Enable = ptr.Of(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !*c.API.Server.Enable {
|
if !*c.API.Server.Enable {
|
||||||
|
@ -291,18 +299,18 @@ func (c *Config) LoadAPIServer() error {
|
||||||
c.API.Server.UseForwardedForHeaders = true
|
c.API.Server.UseForwardedForHeaders = true
|
||||||
}
|
}
|
||||||
if err := c.API.Server.LoadProfiles(); err != nil {
|
if err := c.API.Server.LoadProfiles(); err != nil {
|
||||||
return errors.Wrap(err, "while loading profiles for LAPI")
|
return fmt.Errorf("while loading profiles for LAPI: %w", err)
|
||||||
}
|
}
|
||||||
if c.API.Server.ConsoleConfigPath == "" {
|
if c.API.Server.ConsoleConfigPath == "" {
|
||||||
c.API.Server.ConsoleConfigPath = DefaultConsoleConfigFilePath
|
c.API.Server.ConsoleConfigPath = DefaultConsoleConfigFilePath
|
||||||
}
|
}
|
||||||
if err := c.API.Server.LoadConsoleConfig(); err != nil {
|
if err := c.API.Server.LoadConsoleConfig(); err != nil {
|
||||||
return errors.Wrap(err, "while loading console options")
|
return fmt.Errorf("while loading console options: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.API.Server.OnlineClient != nil && c.API.Server.OnlineClient.CredentialsFilePath != "" {
|
if c.API.Server.OnlineClient != nil && c.API.Server.OnlineClient.CredentialsFilePath != "" {
|
||||||
if err := c.API.Server.OnlineClient.Load(); err != nil {
|
if err := c.API.Server.OnlineClient.Load(); err != nil {
|
||||||
return errors.Wrap(err, "loading online client credentials")
|
return fmt.Errorf("loading online client credentials: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if c.API.Server.OnlineClient == nil || c.API.Server.OnlineClient.Credentials == nil {
|
if c.API.Server.OnlineClient == nil || c.API.Server.OnlineClient.Credentials == nil {
|
||||||
|
@ -311,7 +319,7 @@ func (c *Config) LoadAPIServer() error {
|
||||||
|
|
||||||
if c.API.CTI != nil {
|
if c.API.CTI != nil {
|
||||||
if err := c.API.CTI.Load(); err != nil {
|
if err := c.API.CTI.Load(); err != nil {
|
||||||
return errors.Wrap(err, "loading CTI configuration")
|
return fmt.Errorf("loading CTI configuration: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,7 +362,7 @@ func (s *LocalApiServerCfg) LoadCapiWhitelists() error {
|
||||||
for _, v := range fromCfg.Cidrs {
|
for _, v := range fromCfg.Cidrs {
|
||||||
_, tnet, err := net.ParseCIDR(v)
|
_, tnet, err := net.ParseCIDR(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to parse cidr whitelist '%s' : %v.", v, err)
|
return fmt.Errorf("unable to parse cidr whitelist '%s' : %v", v, err)
|
||||||
}
|
}
|
||||||
s.CapiWhitelists.Cidrs = append(s.CapiWhitelists.Cidrs, tnet)
|
s.CapiWhitelists.Cidrs = append(s.CapiWhitelists.Cidrs, tnet)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,12 +7,12 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLoadLocalApiClientCfg(t *testing.T) {
|
func TestLoadLocalApiClientCfg(t *testing.T) {
|
||||||
|
@ -53,7 +53,7 @@ func TestLoadLocalApiClientCfg(t *testing.T) {
|
||||||
name: "valid configuration with insecure skip verify",
|
name: "valid configuration with insecure skip verify",
|
||||||
input: &LocalApiClientCfg{
|
input: &LocalApiClientCfg{
|
||||||
CredentialsFilePath: "./tests/lapi-secrets.yaml",
|
CredentialsFilePath: "./tests/lapi-secrets.yaml",
|
||||||
InsecureSkipVerify: types.BoolPtr(false),
|
InsecureSkipVerify: ptr.Of(false),
|
||||||
},
|
},
|
||||||
expected: &ApiCredentialsCfg{
|
expected: &ApiCredentialsCfg{
|
||||||
URL: "http://localhost:8080/",
|
URL: "http://localhost:8080/",
|
||||||
|
@ -188,21 +188,21 @@ func TestLoadAPIServer(t *testing.T) {
|
||||||
DisableAPI: false,
|
DisableAPI: false,
|
||||||
},
|
},
|
||||||
expected: &LocalApiServerCfg{
|
expected: &LocalApiServerCfg{
|
||||||
Enable: types.BoolPtr(true),
|
Enable: ptr.Of(true),
|
||||||
ListenURI: "http://crowdsec.api",
|
ListenURI: "http://crowdsec.api",
|
||||||
TLS: nil,
|
TLS: nil,
|
||||||
DbConfig: &DatabaseCfg{
|
DbConfig: &DatabaseCfg{
|
||||||
DbPath: "./tests/test.db",
|
DbPath: "./tests/test.db",
|
||||||
Type: "sqlite",
|
Type: "sqlite",
|
||||||
MaxOpenConns: types.IntPtr(DEFAULT_MAX_OPEN_CONNS),
|
MaxOpenConns: ptr.Of(DEFAULT_MAX_OPEN_CONNS),
|
||||||
},
|
},
|
||||||
ConsoleConfigPath: DefaultConfigPath("console.yaml"),
|
ConsoleConfigPath: DefaultConfigPath("console.yaml"),
|
||||||
ConsoleConfig: &ConsoleConfig{
|
ConsoleConfig: &ConsoleConfig{
|
||||||
ShareManualDecisions: types.BoolPtr(false),
|
ShareManualDecisions: ptr.Of(false),
|
||||||
ShareTaintedScenarios: types.BoolPtr(true),
|
ShareTaintedScenarios: ptr.Of(true),
|
||||||
ShareCustomScenarios: types.BoolPtr(true),
|
ShareCustomScenarios: ptr.Of(true),
|
||||||
ShareContext: types.BoolPtr(false),
|
ShareContext: ptr.Of(false),
|
||||||
ConsoleManagement: types.BoolPtr(false),
|
ConsoleManagement: ptr.Of(false),
|
||||||
},
|
},
|
||||||
LogDir: LogDirFullPath,
|
LogDir: LogDirFullPath,
|
||||||
LogMedia: "stdout",
|
LogMedia: "stdout",
|
||||||
|
|
|
@ -5,13 +5,12 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/csstring"
|
"github.com/crowdsecurity/go-cs-lib/pkg/csstring"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/types"
|
"github.com/crowdsecurity/go-cs-lib/pkg/ptr"
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/yamlpatch"
|
"github.com/crowdsecurity/go-cs-lib/pkg/yamlpatch"
|
||||||
)
|
)
|
||||||
|
|
||||||
// defaultConfigDir is the base path to all configuration files, to be overridden in the Makefile */
|
// defaultConfigDir is the base path to all configuration files, to be overridden in the Makefile */
|
||||||
|
@ -41,18 +40,18 @@ type Config struct {
|
||||||
func (c *Config) Dump() error {
|
func (c *Config) Dump() error {
|
||||||
out, err := yaml.Marshal(c)
|
out, err := yaml.Marshal(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed marshaling config")
|
return fmt.Errorf("failed marshaling config: %w", err)
|
||||||
}
|
}
|
||||||
fmt.Printf("%s", string(out))
|
fmt.Printf("%s", string(out))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool) (*Config, error) {
|
func NewConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool) (*Config, string, error) {
|
||||||
patcher := yamlpatch.NewPatcher(configFile, ".local")
|
patcher := yamlpatch.NewPatcher(configFile, ".local")
|
||||||
patcher.SetQuiet(quiet)
|
patcher.SetQuiet(quiet)
|
||||||
fcontent, err := patcher.MergedPatchContent()
|
fcontent, err := patcher.MergedPatchContent()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, "", err
|
||||||
}
|
}
|
||||||
configData := csstring.StrictExpand(string(fcontent), os.LookupEnv)
|
configData := csstring.StrictExpand(string(fcontent), os.LookupEnv)
|
||||||
cfg := Config{
|
cfg := Config{
|
||||||
|
@ -64,9 +63,9 @@ func NewConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool
|
||||||
err = yaml.UnmarshalStrict([]byte(configData), &cfg)
|
err = yaml.UnmarshalStrict([]byte(configData), &cfg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// this is actually the "merged" yaml
|
// this is actually the "merged" yaml
|
||||||
return nil, errors.Wrap(err, configFile)
|
return nil, "", fmt.Errorf("%s: %w", configFile, err)
|
||||||
}
|
}
|
||||||
return &cfg, nil
|
return &cfg, configData, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDefaultConfig() *Config {
|
func NewDefaultConfig() *Config {
|
||||||
|
@ -112,14 +111,14 @@ func NewDefaultConfig() *Config {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
CTI: &CTICfg{
|
CTI: &CTICfg{
|
||||||
Enabled: types.BoolPtr(false),
|
Enabled: ptr.Of(false),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
dbConfig := DatabaseCfg{
|
dbConfig := DatabaseCfg{
|
||||||
Type: "sqlite",
|
Type: "sqlite",
|
||||||
DbPath: DefaultDataPath("crowdsec.db"),
|
DbPath: DefaultDataPath("crowdsec.db"),
|
||||||
MaxOpenConns: types.IntPtr(DEFAULT_MAX_OPEN_CONNS),
|
MaxOpenConns: ptr.Of(DEFAULT_MAX_OPEN_CONNS),
|
||||||
}
|
}
|
||||||
|
|
||||||
globalCfg := Config{
|
globalCfg := Config{
|
||||||
|
|
|
@ -6,17 +6,17 @@ import (
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"github.com/crowdsecurity/crowdsec/pkg/cstest"
|
"github.com/crowdsecurity/go-cs-lib/pkg/cstest"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNormalLoad(t *testing.T) {
|
func TestNormalLoad(t *testing.T) {
|
||||||
_, err := NewConfig("./tests/config.yaml", false, false, false)
|
_, _, err := NewConfig("./tests/config.yaml", false, false, false)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = NewConfig("./tests/xxx.yaml", false, false, false)
|
_, _, err = NewConfig("./tests/xxx.yaml", false, false, false)
|
||||||
assert.EqualError(t, err, "while reading yaml file: open ./tests/xxx.yaml: "+cstest.FileNotFoundMessage)
|
assert.EqualError(t, err, "while reading yaml file: open ./tests/xxx.yaml: "+cstest.FileNotFoundMessage)
|
||||||
|
|
||||||
_, err = NewConfig("./tests/simulation.yaml", false, false, false)
|
_, _, err = NewConfig("./tests/simulation.yaml", false, false, false)
|
||||||
assert.EqualError(t, err, "./tests/simulation.yaml: yaml: unmarshal errors:\n line 1: field simulation not found in type csconfig.Config")
|
assert.EqualError(t, err, "./tests/simulation.yaml: yaml: unmarshal errors:\n line 1: field simulation not found in type csconfig.Config")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue