docker: replace cp -an with rsync to allow bind-mount of files in /etc/crowdsec (#2611)
fix for https://github.com/crowdsecurity/crowdsec/issues/2480
This commit is contained in:
parent
ec53c672dc
commit
7ffa0cc787
4 changed files with 51 additions and 3 deletions
|
@ -32,7 +32,7 @@ RUN make clean release DOCKER_BUILD=1 BUILD_STATIC=1 && \
|
||||||
|
|
||||||
FROM alpine:latest as slim
|
FROM alpine:latest as slim
|
||||||
|
|
||||||
RUN apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community tzdata bash && \
|
RUN apk add --no-cache --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community tzdata bash rsync && \
|
||||||
mkdir -p /staging/etc/crowdsec && \
|
mkdir -p /staging/etc/crowdsec && \
|
||||||
mkdir -p /staging/etc/crowdsec/acquis.d && \
|
mkdir -p /staging/etc/crowdsec/acquis.d && \
|
||||||
mkdir -p /staging/var/lib/crowdsec && \
|
mkdir -p /staging/var/lib/crowdsec && \
|
||||||
|
|
|
@ -47,7 +47,8 @@ RUN apt-get update && \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
ca-certificates \
|
ca-certificates \
|
||||||
bash \
|
bash \
|
||||||
tzdata && \
|
tzdata \
|
||||||
|
rsync && \
|
||||||
mkdir -p /staging/etc/crowdsec && \
|
mkdir -p /staging/etc/crowdsec && \
|
||||||
mkdir -p /staging/etc/crowdsec/acquis.d && \
|
mkdir -p /staging/etc/crowdsec/acquis.d && \
|
||||||
mkdir -p /staging/var/lib/crowdsec && \
|
mkdir -p /staging/var/lib/crowdsec && \
|
||||||
|
|
|
@ -174,7 +174,7 @@ if [ ! -e "/etc/crowdsec/local_api_credentials.yaml" ] && [ ! -e "/etc/crowdsec/
|
||||||
mkdir -p /etc/crowdsec/
|
mkdir -p /etc/crowdsec/
|
||||||
# if you change this, check that it still works
|
# if you change this, check that it still works
|
||||||
# under alpine and k8s, with and without tls
|
# under alpine and k8s, with and without tls
|
||||||
cp -an /staging/etc/crowdsec/* /etc/crowdsec/
|
rsync -av --ignore-existing /staging/etc/crowdsec/* /etc/crowdsec
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
47
docker/test/tests/test_local_item.py
Normal file
47
docker/test/tests/test_local_item.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
"""
|
||||||
|
Test bind-mounting local items
|
||||||
|
"""
|
||||||
|
|
||||||
|
from http import HTTPStatus
|
||||||
|
import json
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
pytestmark = pytest.mark.docker
|
||||||
|
|
||||||
|
|
||||||
|
def test_inject_local_item(crowdsec, tmp_path_factory, flavor):
|
||||||
|
"""Test mounting a custom whitelist at startup"""
|
||||||
|
|
||||||
|
localitems = tmp_path_factory.mktemp('localitems')
|
||||||
|
custom_whitelists = localitems / 'custom_whitelists.yaml'
|
||||||
|
|
||||||
|
with open(custom_whitelists, 'w') as f:
|
||||||
|
f.write('{"whitelist":{"reason":"Good IPs","ip":["1.2.3.4"]}}')
|
||||||
|
|
||||||
|
volumes = {
|
||||||
|
custom_whitelists: {'bind': '/etc/crowdsec/parsers/s02-enrich/custom_whitelists.yaml'}
|
||||||
|
}
|
||||||
|
|
||||||
|
with crowdsec(flavor=flavor, volumes=volumes) as cs:
|
||||||
|
cs.wait_for_log([
|
||||||
|
"*Starting processing data*"
|
||||||
|
])
|
||||||
|
cs.wait_for_http(8080, '/health', want_status=HTTPStatus.OK)
|
||||||
|
|
||||||
|
# the parser should be enabled
|
||||||
|
res = cs.cont.exec_run('cscli parsers list -o json')
|
||||||
|
assert res.exit_code == 0
|
||||||
|
j = json.loads(res.output)
|
||||||
|
items = {c['name']: c for c in j['parsers']}
|
||||||
|
assert items['custom_whitelists.yaml']['status'] == 'enabled,local'
|
||||||
|
|
||||||
|
# regression test: the linux collection should not be tainted
|
||||||
|
# (the parsers were not copied from /staging when using "cp -an" with local parsers)
|
||||||
|
res = cs.cont.exec_run('cscli collections inspect crowdsecurity/linux -o json')
|
||||||
|
assert res.exit_code == 0
|
||||||
|
j = json.loads(res.output)
|
||||||
|
# crowdsec <= 1.5.5 omits a "tainted" when it's false
|
||||||
|
assert j.get('tainted', False) is False
|
Loading…
Reference in a new issue