core - Add bwcli tests
This commit is contained in:
parent
ab3b3ea8fd
commit
97723185ba
|
@ -0,0 +1,14 @@
|
|||
FROM python:3.11.3-alpine
|
||||
|
||||
WORKDIR /tmp
|
||||
|
||||
COPY requirements.txt .
|
||||
|
||||
RUN MAKEFLAGS="-j $(nproc)" pip install --no-cache -r requirements.txt && \
|
||||
rm -f requirements.txt
|
||||
|
||||
WORKDIR /opt/tests
|
||||
|
||||
COPY main.py .
|
||||
|
||||
ENTRYPOINT [ "python3", "main.py" ]
|
|
@ -0,0 +1,7 @@
|
|||
version: "3.5"
|
||||
|
||||
services:
|
||||
tests:
|
||||
build: .
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
@ -0,0 +1,55 @@
|
|||
version: "3.5"
|
||||
|
||||
services:
|
||||
bw:
|
||||
image: bunkerity/bunkerweb:1.5.0-beta
|
||||
pull_policy: never
|
||||
depends_on:
|
||||
- bw-redis
|
||||
labels:
|
||||
- "bunkerweb.INSTANCE"
|
||||
environment:
|
||||
API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
|
||||
USE_BUNKERNET: "no"
|
||||
USE_BLACKLIST: "no"
|
||||
LOG_LEVEL: "info"
|
||||
USE_REDIS: "yes"
|
||||
REDIS_HOST: "bw-redis"
|
||||
networks:
|
||||
- bw-universe
|
||||
|
||||
bw-scheduler:
|
||||
image: bunkerity/bunkerweb-scheduler:1.5.0-beta
|
||||
pull_policy: never
|
||||
depends_on:
|
||||
- bw
|
||||
- bw-docker
|
||||
environment:
|
||||
DOCKER_HOST: "tcp://bw-docker:2375"
|
||||
LOG_LEVEL: "info"
|
||||
networks:
|
||||
- bw-universe
|
||||
- bw-docker
|
||||
|
||||
bw-docker:
|
||||
image: tecnativa/docker-socket-proxy
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
environment:
|
||||
CONTAINERS: "1"
|
||||
networks:
|
||||
- bw-docker
|
||||
|
||||
bw-redis:
|
||||
image: redis:7-alpine
|
||||
networks:
|
||||
- bw-universe
|
||||
|
||||
networks:
|
||||
bw-universe:
|
||||
name: bw-universe
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.20.30.0/24
|
||||
bw-docker:
|
|
@ -0,0 +1,111 @@
|
|||
from os import getenv
|
||||
from traceback import format_exc
|
||||
from docker import DockerClient
|
||||
from docker.models.containers import Container
|
||||
|
||||
try:
|
||||
docker_host = getenv("DOCKER_HOST", "unix:///var/run/docker.sock")
|
||||
docker_client = DockerClient(base_url=docker_host)
|
||||
|
||||
bw_instances = docker_client.containers.list(
|
||||
filters={"label": "bunkerweb.INSTANCE"}
|
||||
)
|
||||
|
||||
if not bw_instances:
|
||||
print("❌ BunkerWeb instance not found ...", flush=True)
|
||||
exit(1)
|
||||
|
||||
bw_instance: Container = bw_instances[0]
|
||||
|
||||
print(
|
||||
'ℹ️ Executing the command "bwcli ban 127.0.0.1 -exp 3600" inside the BW container ...',
|
||||
flush=True,
|
||||
)
|
||||
|
||||
result = bw_instance.exec_run("bwcli ban 127.0.0.1 -exp 3600")
|
||||
|
||||
if result.exit_code != 0:
|
||||
print(
|
||||
f'❌ Command "ban" failed, exiting ...\noutput: {result.output.decode()}\nexit_code: {result.exit_code}'
|
||||
)
|
||||
exit(1)
|
||||
|
||||
print(result.output.decode(), flush=True)
|
||||
|
||||
print(
|
||||
'ℹ️ Executing the command "bwcli bans" inside the BW container and checking the result ...',
|
||||
flush=True,
|
||||
)
|
||||
|
||||
result = bw_instance.exec_run("bwcli bans")
|
||||
|
||||
if result.exit_code != 0:
|
||||
print(
|
||||
f'❌ Command "bans" failed, exiting ...\noutput: {result.output.decode()}\nexit_code: {result.exit_code}'
|
||||
)
|
||||
exit(1)
|
||||
|
||||
if b"- 127.0.0.1" not in result.output:
|
||||
print(
|
||||
f'❌ IP 127.0.0.1 not found in the output of "bans", exiting ...\noutput: {result.output.decode()}'
|
||||
)
|
||||
exit(1)
|
||||
elif b"List of bans for redis:" not in result.output:
|
||||
print(
|
||||
f'❌ Redis ban list not found in the output of "bans", exiting ...\noutput: {result.output.decode()}'
|
||||
)
|
||||
exit(1)
|
||||
elif b"1 hour" not in result.output or b"59 minutes" not in result.output:
|
||||
print(
|
||||
f"❌ Ban duration isn't 1 hour, exiting ...\noutput: {result.output.decode()}"
|
||||
)
|
||||
exit(1)
|
||||
|
||||
print(result.output.decode(), flush=True)
|
||||
|
||||
print(
|
||||
'ℹ️ Executing the command "bwcli unban 127.0.0.1" inside the BW container ...',
|
||||
flush=True,
|
||||
)
|
||||
|
||||
result = bw_instance.exec_run("bwcli unban 127.0.0.1")
|
||||
|
||||
if result.exit_code != 0:
|
||||
print(
|
||||
f'❌ Command "unban" failed, exiting ...\noutput: {result.output.decode()}\nexit_code: {result.exit_code}'
|
||||
)
|
||||
exit(1)
|
||||
|
||||
print(result.output.decode(), flush=True)
|
||||
|
||||
print(
|
||||
'ℹ️ Executing the command "bwcli bans" inside the BW container to check if the IP was unbanned ...',
|
||||
flush=True,
|
||||
)
|
||||
|
||||
result = bw_instance.exec_run("bwcli bans")
|
||||
|
||||
if result.exit_code != 0:
|
||||
print(
|
||||
f'❌ Command "bans" failed, exiting ...\noutput: {result.output.decode()}\nexit_code: {result.exit_code}'
|
||||
)
|
||||
exit(1)
|
||||
|
||||
found = 0
|
||||
for line in result.output.splitlines():
|
||||
if b"No ban found" in line:
|
||||
found += 1
|
||||
|
||||
if found < 2:
|
||||
print(
|
||||
f"❌ IP 127.0.0.1 was not unbanned from both redis and the local ban list, exiting ...\noutput: {result.output.decode()}",
|
||||
flush=True,
|
||||
)
|
||||
exit(1)
|
||||
|
||||
print(result.output.decode(), flush=True)
|
||||
except SystemExit:
|
||||
exit(1)
|
||||
except:
|
||||
print(f"❌ Something went wrong, exiting ...\n{format_exc()}", flush=True)
|
||||
exit(1)
|
|
@ -0,0 +1 @@
|
|||
docker==6.1.2
|
|
@ -0,0 +1,88 @@
|
|||
#!/bin/bash
|
||||
|
||||
echo "⌨️ Building bunkernet stack ..."
|
||||
|
||||
# Starting stack
|
||||
docker compose pull bw-docker
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "⌨️ Pull failed ❌"
|
||||
exit 1
|
||||
fi
|
||||
docker compose -f docker-compose.test.yml build
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "⌨️ Build failed ❌"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cleanup_stack () {
|
||||
echo "⌨️ Cleaning up current stack ..."
|
||||
|
||||
docker compose down -v --remove-orphans 2>/dev/null
|
||||
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "⌨️ Down failed ❌"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "⌨️ Cleaning up current stack done ✅"
|
||||
}
|
||||
|
||||
# Cleanup stack on exit
|
||||
trap cleanup_stack EXIT
|
||||
|
||||
echo "⌨️ Running bwcli tests ..."
|
||||
|
||||
echo "⌨️ Starting stack ..."
|
||||
docker compose up -d 2>/dev/null
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "⌨️ Up failed, retrying ... ⚠️"
|
||||
manual=1
|
||||
cleanup_stack
|
||||
manual=0
|
||||
docker compose up -d 2>/dev/null
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "⌨️ Up failed ❌"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Check if stack is healthy
|
||||
echo "⌨️ Waiting for stack to be healthy ..."
|
||||
i=0
|
||||
while [ $i -lt 120 ] ; do
|
||||
containers=("bwcli-bw-1" "bwcli-bw-scheduler-1")
|
||||
healthy="true"
|
||||
for container in "${containers[@]}" ; do
|
||||
check="$(docker inspect --format "{{json .State.Health }}" $container | grep "healthy")"
|
||||
if [ "$check" = "" ] ; then
|
||||
healthy="false"
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ "$healthy" = "true" ] ; then
|
||||
echo "⌨️ Docker stack is healthy ✅"
|
||||
break
|
||||
fi
|
||||
sleep 1
|
||||
i=$((i+1))
|
||||
done
|
||||
if [ $i -ge 120 ] ; then
|
||||
docker compose logs
|
||||
echo "⌨️ Docker stack is not healthy ❌"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Start tests
|
||||
|
||||
docker compose -f docker-compose.test.yml up --abort-on-container-exit --exit-code-from tests 2>/dev/null
|
||||
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "⌨️ Test bwcli failed ❌"
|
||||
echo "🛡️ Showing BunkerWeb and BunkerWeb Scheduler logs ..."
|
||||
docker compose logs bw bw-scheduler
|
||||
exit 1
|
||||
else
|
||||
echo "⌨️ Test bwcli succeeded ✅"
|
||||
fi
|
||||
|
||||
echo "⌨️ Tests are done ! ✅"
|
Loading…
Reference in New Issue