bunkerweb 1.4.0

This commit is contained in:
bunkerity
2022-06-03 17:24:14 +02:00
parent 3a078326c5
commit a9f886804a
5245 changed files with 1432051 additions and 27894 deletions

View File

@@ -1,12 +0,0 @@
FROM archlinux:base
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
RUN pacman -Syu --noconfirm

View File

@@ -1,5 +1,8 @@
FROM centos:7
FROM quay.io/centos/centos:stream8
RUN yum install -y initscripts # for old "service"
ENV container=docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
@@ -9,3 +12,13 @@ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
COPY linux/nginx.repo /etc/yum.repos.d/nginx.repo
#COPY linux/nginx.repo /etc/yum.repos.d/nginx.repo
RUN dnf install yum-utils epel-release -y && \
dnf install nginx-1.20.2 -y
VOLUME /run /tmp
CMD /usr/sbin/init

View File

@@ -1,12 +1,36 @@
FROM debian:bullseye-slim
FROM debian:bullseye
RUN apt update && apt install -y systemd init
ENV container docker
ENV LC_ALL C
ENV DEBIAN_FRONTEND noninteractive
ENV NGINX_VERSION 1.20.2
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
RUN apt-get update \
&& apt-get install -y systemd systemd-sysv \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN cd /lib/systemd/system/sysinit.target.wants/ \
&& rm $(ls | grep -v systemd-tmpfiles-setup)
RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
/etc/systemd/system/*.wants/* \
/lib/systemd/system/local-fs.target.wants/* \
/lib/systemd/system/sockets.target.wants/*udev* \
/lib/systemd/system/sockets.target.wants/*initctl* \
/lib/systemd/system/basic.target.wants/* \
/lib/systemd/system/anaconda.target.wants/* \
/lib/systemd/system/plymouth* \
/lib/systemd/system/systemd-update-utmp*
RUN apt update && \
apt-get install gnupg2 ca-certificates python3-pip -y && \
echo "deb https://nginx.org/packages/debian/ bullseye nginx" > /etc/apt/sources.list.d/nginx.list && \
echo "deb-src https://nginx.org/packages/debian/ bullseye nginx" >> /etc/apt/sources.list.d/nginx.list && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62 && \
apt-get update && \
apt-get install -y --no-install-recommends nginx=${NGINX_VERSION}-1~bullseye
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/lib/systemd/systemd"]

View File

@@ -1,18 +1,27 @@
FROM fedora:34
FROM fedora:latest
RUN dnf install -y systemd findutils
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;\
rm -f /lib/systemd/system/*tmpfiles*;\
rm -f /lib/systemd/user/*tmpfiles*;\
find /lib/systemd/ -type f -iname "*.service" -exec rm -f {} \;;\
find /etc/systemd/ -type f -iname "*.service" -exec rm -f {} \;;\
find /lib/systemd/ -type f -iname "*.timer" -exec rm -f {} \;;\
find /etc/systemd/ -type f -iname "*.timer" -exec rm -f {} \;
RUN dnf -y update \
&& dnf -y install systemd \
&& dnf clean all
RUN cd /lib/systemd/system/sysinit.target.wants/; \
for i in *; do [ $i = systemd-tmpfiles-setup.service ] || rm -f $i; done
RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
/etc/systemd/system/*.wants/* \
/lib/systemd/system/local-fs.target.wants/* \
/lib/systemd/system/sockets.target.wants/*udev* \
/lib/systemd/system/sockets.target.wants/*initctl* \
/lib/systemd/system/basic.target.wants/* \
/lib/systemd/system/anaconda.target.wants/*
# Nginx
RUN dnf update -y && \
dnf install -y curl gnupg2 ca-certificates redhat-lsb-core python3-pip && \
dnf install nginx-1.20.2 -y
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

View File

@@ -1,12 +1,36 @@
FROM ubuntu:focal
FROM ubuntu:22.04
RUN apt update && apt install -y systemd init
ENV container docker
ENV LC_ALL C
ENV DEBIAN_FRONTEND noninteractive
ENV NGINX_VERSION 1.20.2
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
RUN apt-get update \
&& apt-get install -y systemd systemd-sysv \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN cd /lib/systemd/system/sysinit.target.wants/ \
&& rm $(ls | grep -v systemd-tmpfiles-setup)
RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
/etc/systemd/system/*.wants/* \
/lib/systemd/system/local-fs.target.wants/* \
/lib/systemd/system/sockets.target.wants/*udev* \
/lib/systemd/system/sockets.target.wants/*initctl* \
/lib/systemd/system/basic.target.wants/* \
/lib/systemd/system/anaconda.target.wants/* \
/lib/systemd/system/plymouth* \
/lib/systemd/system/systemd-update-utmp*
RUN apt update && \
apt-get install curl gnupg2 ca-certificates lsb-release ubuntu-keyring software-properties-common python3-pip -y && \
echo "deb https://nginx.org/packages/ubuntu/ jammy nginx" > /etc/apt/sources.list.d/nginx.list && \
echo "deb-src https://nginx.org/packages/ubuntu/ jammy nginx" >> /etc/apt/sources.list.d/nginx.list && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62 && \
apt-get update && \
apt-get install -y --no-install-recommends nginx=${NGINX_VERSION}-1~jammy
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/lib/systemd/systemd"]

54
tests/README Normal file
View File

@@ -0,0 +1,54 @@
###############################################################
# HOW TO USE UBUNTU #
###############################################################
# 1. Build the Dockerfile for Ubuntu
sudo docker build -t ubuntu -f Container/Ubuntu/Dockerfile .
# 2. Run it as daemon
sudo docker run -d --name ubuntu --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v "Deb_Folder":/data ubuntu
# 3. Execute
sudo docker exec -it ubuntu bash
#______________________________________________________________________________________________________________________#
###############################################################
# HOW TO USE DEBIAN #
###############################################################
# 1. Build the Dockerfile for Debian
sudo docker build -t debian -f Container/Debian/Dockerfile .
# 2. Run it as daemon
sudo docker run -d --name debian --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v "Deb_Folder":/data debian
# 3. Execute
sudo docker exec -it debian bash
#______________________________________________________________________________________________________________________#
###############################################################
# HOW TO USE FEDORA #
###############################################################
# Build the Dockerfile for Debian
sudo docker build -t fedora -f Container/Fedora/Dockerfile .
# Run it as daemon
sudo docker run -d --name fedora --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v "Deb_Folder":/data fedora
# Execute
sudo docker exec -it fedora bash
#______________________________________________________________________________________________________________________#
###############################################################
# HOW TO USE CENTOS #
###############################################################
# Build the Dockerfile for Debian
sudo docker build -t centos -f Container/Centos8/Dockerfile .
# Run it as daemon
sudo docker run -d --name centos --privileged -v /sys/fs/cgroup:/sys/fs/cgroup -v "Deb_Folder":/data centos
# Execute
sudo docker exec -it centos bash
#______________________________________________________________________________________________________________________#

111
tests/autoconf.sh Executable file
View File

@@ -0,0 +1,111 @@
#!/bin/bash
. ./tests/utils/utils.sh
. /opt/.runner_env
function single_autoconf_test() {
example="$1"
wait_time="$2"
shift
shift
asserts=("$@")
echo "Testing $example ..."
exec_docker_example "$example"
if [ $? -ne 0 ] ; then
cd /tmp/autoconf
docker-compose logs
docker-compose down -v > /dev/null 2>&1
echo "$example failed (exec) ..."
exit 1
fi
for assert in "${asserts[@]}" ; do
url="$(echo "$assert" | cut -d ' ' -f 1)"
str="$(echo "$assert" | cut -d ' ' -f 2)"
if [ "$(echo "$example" | grep websocket)" = "" ] ; then
curl_assert "$url" "$str" "$wait_time"
else
curl_assert "$url" "$str" "$wait_time" "ws"
fi
ret=$?
if [ $ret -ne 0 ] ; then
current_dir="$(pwd)"
cd /tmp/autoconf
docker-compose logs
docker-compose down -v > /dev/null 2>&1
cd "/tmp/tests/$example"
docker-compose logs
cd "$current_dir"
rm_example "$example"
echo "$example failed (assert) ..."
exit 1
fi
done
rm_example "$example"
echo "$example success !"
}
# Setup data folder if not present
if [ ! -d "/tmp/bw-data" ] ; then
mkdir /tmp/bw-data
sudo chown root:101 /tmp/bw-data
sudo chmod 770 /tmp/bw-data
fi
for folder in $(echo "configs plugins www") ; do
sudo rm -rf "/tmp/bw-data/${folder}" > /dev/null 2>&1
done
echo "Running autoconf tests ..."
# Start autoconf
if [ ! -d "/tmp/autoconf" ] ; then
mkdir /tmp/autoconf
fi
rm -rf /tmp/autoconf/*
cp -r ./integrations/autoconf/* /tmp/autoconf
sed -i 's@bunkerity/bunkerweb:.*$@10.20.1.1:5000/bw-tests:latest@g' /tmp/autoconf/docker-compose.yml
sed -i 's@bunkerity/bunkerweb-autoconf:.*$@10.20.1.1:5000/bw-autoconf-tests:latest@g' /tmp/autoconf/docker-compose.yml
sed -i 's@\./bw\-data:/@/tmp/bw\-data:/@g' /tmp/autoconf/docker-compose.yml
current_dir="$(pwd)"
cd "/tmp/autoconf"
echo "starting autoconf ..."
docker-compose down -v > /dev/null 2>&1
docker-compose pull > /dev/null 2>&1
ret="$(docker-compose up -d 2>&1)"
if [ $? -ne 0 ] ; then
echo "$ret"
echo "autoconf failed (up)"
fi
current_wait=0
healthy="no"
while [ $current_wait -lt 30 ] ; do
check="$(docker inspect --format "{{json .State.Health }}" autoconf_mybunker_1 | grep healthy)"
if [ "$check" != "" ] ; then
healthy="yes"
break
fi
current_wait=$((current_wait+1))
sleep 1
done
if [ "$healthy" = "no" ] ; then
echo "$ret"
docker-compose logs
docker-compose down -v > /dev/null 2>&1
echo "autoconf failed (not healthy)"
exit 1
fi
cd "$current_dir"
# reverse
single_autoconf_test "autoconf-reverse-proxy" "60" "https://$TEST_DOMAIN1_1 hello" "https://$TEST_DOMAIN1_2 hello" "https://$TEST_DOMAIN1_3 hello"
# php
single_autoconf_test "autoconf-php" "60" "https://$TEST_DOMAIN1_1 app1" "https://$TEST_DOMAIN1_2 app2" "https://$TEST_DOMAIN1_3 app3"
# cleanup
current_dir="$(pwd)"
cd "/tmp/autoconf"
docker-compose down -v > /dev/null 2>&1
cd "$current_dir"
exit 0

110
tests/docker.sh Executable file
View File

@@ -0,0 +1,110 @@
#!/bin/bash
. ./tests/utils/utils.sh
. /opt/.runner_env
function single_docker_test() {
example="$1"
wait_time="$2"
shift
shift
asserts=("$@")
echo "Testing $example ..."
exec_docker_example "$example"
if [ $? -ne 0 ] ; then
echo "$example failed (exec) ..."
exit 1
fi
for assert in "${asserts[@]}" ; do
url="$(echo "$assert" | cut -d ' ' -f 1)"
str="$(echo "$assert" | cut -d ' ' -f 2)"
if [ "$(echo "$example" | grep websocket)" = "" ] ; then
curl_assert "$url" "$str" "$wait_time"
else
curl_assert "$url" "$str" "$wait_time" "ws"
fi
ret=$?
if [ $ret -ne 0 ] ; then
current_dir="$(pwd)"
cd "/tmp/tests/$example"
docker-compose logs
cd "$current_dir"
rm_example "$example"
echo "$example failed (assert) ..."
exit 1
fi
done
rm_example "$example"
echo "$example success !"
}
# Setup data folder if not present
if [ ! -d "/tmp/bw-data" ] ; then
mkdir /tmp/bw-data
sudo chown 101:101 /tmp/bw-data
sudo chmod 777 /tmp/bw-data
fi
echo "Running Docker tests ..."
# drupal
single_docker_test "drupal" "60" "https://$TEST_DOMAIN1 drupal"
# ghost
single_docker_test "ghost" "30" "https://$TEST_DOMAIN1 ghost"
# gogs
single_docker_test "gogs" "30" "https://$TEST_DOMAIN1 gogs"
# hardened
single_docker_test "hardened" "30" "https://$TEST_DOMAIN1 hello"
# joomla
single_docker_test "joomla" "60" "https://$TEST_DOMAIN1 joomla"
# load-balancer
single_docker_test "load-balancer" "30" "https://$TEST_DOMAIN1 hello"
# magento
single_docker_test "magento" "180" "https://$TEST_DOMAIN1 magento"
# moodle
single_docker_test "moodle" "300" "https://$TEST_DOMAIN1 moodle"
# nextcloud
single_docker_test "nextcloud" "120" "https://$TEST_DOMAIN1 nextcloud"
# passbolt
single_docker_test "passbolt" "120" "https://$TEST_DOMAIN1 passbolt"
# php-multisite
single_docker_test "php-multisite" "30" "https://$TEST_DOMAIN1_1 app1" "https://$TEST_DOMAIN1_2 app2"
# php-singlesite
single_docker_test "php-singlesite" "30" "https://$TEST_DOMAIN1 hello"
# prestashop
single_docker_test "prestashop" "120" "https://$TEST_DOMAIN1 prestashop"
# redmine
single_docker_test "redmine" "60" "https://$TEST_DOMAIN1 redmine"
# reverse-proxy-multisite
single_docker_test "reverse-proxy-multisite" "30" "https://$TEST_DOMAIN1_1 app1" "https://$TEST_DOMAIN1_2 hello"
# reverse-proxy-singlesite
single_docker_test "reverse-proxy-singlesite" "30" "https://$TEST_DOMAIN1/app1/ app1" "https://$TEST_DOMAIN1/app2/ hello"
# reverse-proxy-websocket
cp ./tests/utils/websocat_amd64-linux /tmp/
chmod +x ./tests/utils/websocat_amd64-linux
# todo
# tomcat
single_docker_test "tomcat" "30" "https://$TEST_DOMAIN1 tomcat"
# wordpress
single_docker_test "wordpress" "30" "https://$TEST_DOMAIN1 wordpress"
exit 0

View File

@@ -1 +0,0 @@
ok

147
tests/kubernetes.sh Executable file
View File

@@ -0,0 +1,147 @@
#!/bin/bash
. ./tests/utils/utils.sh
. /opt/.runner_env
function single_k8s_test() {
example="$1"
wait_time="$2"
shift
shift
asserts=("$@")
echo "Testing $example ..."
exec_k8s_example "$example"
if [ $? -ne 0 ] ; then
for pod in $(sudo kubectl get pods | cut -d ' ' -f 1 | grep -v NAME) ; do
sudo kubectl logs $pod
done
cd "/tmp/k8s"
sudo kubectl delete -f bunkerweb.yml > /dev/null 2>&1
sudo kubectl delete -f rbac.yml > /dev/null 2>&1
sudo kubectl delete -f k8s.yml > /dev/null 2>&1
echo "$example failed (exec) ..."
exit 1
fi
for assert in "${asserts[@]}" ; do
url="$(echo "$assert" | cut -d ' ' -f 1)"
str="$(echo "$assert" | cut -d ' ' -f 2)"
if [ "$(echo "$example" | grep websocket)" = "" ] ; then
curl_assert "$url" "$str" "$wait_time"
else
curl_assert "$url" "$str" "$wait_time" "ws"
fi
ret=$?
if [ $ret -ne 0 ] ; then
for pod in $(sudo kubectl get pods | cut -d ' ' -f 1 | grep -v NAME) ; do
sudo kubectl logs $pod
done
cd "/tmp/k8s"
sudo kubectl delete -f bunkerweb.yml > /dev/null 2>&1
sudo kubectl delete -f rbac.yml > /dev/null 2>&1
sudo kubectl delete -f k8s.yml > /dev/null 2>&1
cd "/tmp/tests/$example"
for yml in $(ls *.yml) ; do
sudo kubectl delete -f "$yml"
done
echo "$example failed (curl) ..."
exit 1
fi
done
current_dir="$(pwd)"
cd "/tmp/tests/$example"
for yml in $(ls *.yml) ; do
sudo kubectl delete -f "$yml"
done
cd "$current_dir"
echo "$example success !"
}
echo "Running k8s tests ..."
# Start k8s
if [ ! -d "/tmp/k8s" ] ; then
mkdir /tmp/k8s
fi
rm -rf /tmp/k8s/*
cp -r ./integrations/kubernetes/* /tmp/k8s
cp ./tests/utils/k8s.yml /tmp/k8s
sed -i 's@bunkerity/bunkerweb:.*$@10.20.1.1:5000/bw-tests:latest@g' /tmp/k8s/bunkerweb.yml
sed -i 's@bunkerity/bunkerweb-autoconf:.*$@10.20.1.1:5000/bw-autoconf-tests:latest@g' /tmp/k8s/bunkerweb.yml
sed -i 's@ifNotPresent@Always@g' /tmp/k8s/bunkerweb.yml
current_dir="$(pwd)"
cd "/tmp/k8s"
# delete old objects
sudo kubectl delete -f bunkerweb.yml > /dev/null 2>&1
sudo kubectl delete -f rbac.yml > /dev/null 2>&1
sudo kubectl delete -f k8s.yml > /dev/null 2>&1
current_wait=0
while [ 1 ] ; do
if [ $current_wait -gt 30 ] ; then
echo "can't remove old k8s objects"
exit 1
fi
if [ "$(sudo kubectl get pods | grep "bunkerweb")" = "" ] ; then
break
fi
current_wait=$((current_wait+1))
sleep 1
done
# start the controller and instances
sudo kubectl apply -f k8s.yml
if [ $? -ne 0 ] ; then
echo "k8s failed (deploy k8s.yml)"
exit 1
fi
sudo kubectl apply -f rbac.yml
if [ $? -ne 0 ] ; then
sudo kubectl delete -f k8s.yml
echo "k8s failed (deploy rbac.yml)"
exit 1
fi
sudo kubectl apply -f bunkerweb.yml
if [ $? -ne 0 ] ; then
sudo kubectl delete -f rbac.yml
sudo kubectl delete -f k8s.yml
echo "k8s failed (deploy bunkerweb.yml)"
exit 1
fi
current_wait=0
healthy="no"
while [ $current_wait -lt 30 ] ; do
check="$(sudo kubectl get pods | grep bunkerweb | grep -v Running)"
if [ "$check" = "" ] ; then
healthy="yes"
break
fi
current_wait=$((current_wait+1))
sleep 1
done
if [ "$healthy" = "no" ] ; then
sudo kubectl get pods
sudo kubectl delete -f bunkerweb.yml > /dev/null 2>&1
sudo kubectl delete -f rbac.yml > /dev/null 2>&1
sudo kubectl delete -f k8s.yml > /dev/null 2>&1
echo "k8s failed (not healthy)"
exit 1
fi
cd "$current_dir"
sleep 60
# reverse
single_k8s_test "kubernetes-ingress" "120" "https://$TEST_DOMAIN1 hello" "https://$TEST_DOMAIN2 hello" "https://$TEST_DOMAIN3 hello"
# configs
single_k8s_test "kubernetes-configs" "120" "https://$TEST_DOMAIN1/app1 app1" "https://$TEST_DOMAIN2/app2 app2" "https://$TEST_DOMAIN3/app3 app3" "https://$TEST_DOMAIN1/hello hello" "https://$TEST_DOMAIN2/hello hello" "https://$TEST_DOMAIN3/hello hello"
# cleanup
current_dir="$(pwd)"
cd "/tmp/k8s"
sudo kubectl delete -f bunkerweb.yml > /dev/null 2>&1
sudo kubectl delete -f rbac.yml > /dev/null 2>&1
sudo kubectl delete -f k8s.yml > /dev/null 2>&1
cd "$current_dir"
exit 0

View File

@@ -1,99 +0,0 @@
#!/bin/bash
function cleanup() {
docker kill "$1"
sleep 30
docker volume rm "linux-tmp"
}
image="$1"
name="$2"
do_cleanup="yes"
if [ "$3" == "no" ] ; then
do_cleanup="no"
fi
echo "[*] Create volume"
docker volume create linux-tmp
if [ $? -ne 0 ] ; then
echo "[!] docker volume failed"
exit 1
fi
echo "[*] Run $image"
id="$(docker run --rm -d -p 80:80 -p 443:443 --privileged=true --name "$name" -v linux-tmp:/tmp "$image" /sbin/init)"
if [ $? -ne 0 ] ; then
echo "[!] docker run failed"
cleanup "$name"
exit 1
fi
echo "[*] Copy install.sh"
docker cp helpers/install.sh "$name:/tmp"
if [ $? -ne 0 ] ; then
echo "[!] docker cp failed"
cleanup "$name"
exit 2
fi
echo "[*] Copy bunkerized-nginx"
docker cp . "$name:/tmp/bunkerized-nginx-test"
if [ $? -ne 0 ] ; then
echo "[!] docker cp failed"
cleanup "$name"
exit 3
fi
echo "[*] Exec install.sh"
docker exec "$name" /bin/bash -c 'chmod +x /tmp/install.sh && /tmp/install.sh'
if [ $? -ne 0 ] ; then
echo "[!] docker exec failed"
cleanup "$name"
exit 4
fi
echo "[*] Exec nginx -V"
docker exec "$name" nginx -V
if [ $? -ne 0 ] ; then
echo "[!] docker exec failed"
cleanup "$name"
exit 5
fi
echo "[*] Copy variables.env"
docker cp "tests/variables.env" "$name:/opt/bunkerized-nginx"
if [ $? -ne 0 ] ; then
echo "[!] docker cp failed"
cleanup "$name"
exit 6
fi
echo "[*] Copy index.html"
docker cp "tests/index.html" "$name:/opt/bunkerized-nginx/www"
if [ $? -ne 0 ] ; then
echo "[!] docker cp failed"
cleanup "$name"
exit 7
fi
echo "[*] Exec bunkerized-nginx"
docker exec "$name" bunkerized-nginx
if [ $? -ne 0 ] ; then
echo "[!] docker exec failed"
cleanup "$name"
exit 8
fi
echo "[*] Exec curl"
res="$(curl -s -H "User-Agent: LegitOne" http://localhost/)"
if [ $? -ne 0 ] || [ "$res" != "ok" ] ; then
echo "[!] curl failed"
cleanup "$name"
exit 9
fi
if [ "$do_cleanup" == "yes" ] ; then
cleanup "$name"
fi
exit 0

43
tests/linux.sh Executable file
View File

@@ -0,0 +1,43 @@
#!/bin/bash
. ./tests/utils/utils.sh
function gen_package() {
mode="$1"
linux="$2"
version="$(cat VERSION | tr -d '\n')"
if [ "$linux" = "fedora" ] || [ "$linux" = "centos" ] ; then
type="rpm"
else
type="deb"
fi
if [ "$mode" = "dev" ] ; then
do_and_check_cmd docker run --rm -v "/tmp/packages/${linux}:/data" "bw-${linux}-${mode}:latest"
fi
name="bunkerweb_${version}-1_amd64"
if [ "$type" = "rpm" ] ; then
name="bunkerweb-${version}-1.x86_64"
fi
do_and_check_cmd cp "/tmp/packages/${linux}/bunkerweb.$type" "/opt/packages/${mode}/${linux}/${name}.${type}"
}
echo "Linux tests"
if [ ! -d /opt/packages ] ; then
do_and_check_cmd sudo mkdir -p /opt/packages/{dev,prod}/{ubuntu,debian,fedora,centos}
do_and_check_cmd sudo chmod -R 777 /opt/packages/
fi
if [ -d /tmp/packages ] ; then
do_and_check_cmd sudo rm -rf /tmp/packages
fi
do_and_check_cmd mkdir /tmp/packages
# Generate packages
gen_package "$1" "ubuntu"
gen_package "$1" "debian"
gen_package "$1" "centos"
gen_package "$1" "fedora"
exit 0

125
tests/swarm.sh Executable file
View File

@@ -0,0 +1,125 @@
#!/bin/bash
. ./tests/utils/utils.sh
. /opt/.runner_env
function single_swarm_test() {
example="$1"
wait_time="$2"
shift
shift
asserts=("$@")
echo "Testing $example ..."
exec_swarm_example "$example"
if [ $? -ne 0 ] ; then
docker service logs bunkerweb_mybunker
docker service logs bunkerweb_myautoconf
docker stack rm bunkerweb > /dev/null 2>&1
for config in $(docker config ls --format "{{ .ID }}") ; do
docker config rm $config
done
echo "$example failed (exec) ..."
exit 1
fi
for assert in "${asserts[@]}" ; do
url="$(echo "$assert" | cut -d ' ' -f 1)"
str="$(echo "$assert" | cut -d ' ' -f 2)"
if [ "$(echo "$example" | grep websocket)" = "" ] ; then
curl_assert "$url" "$str" "$wait_time"
else
curl_assert "$url" "$str" "$wait_time" "ws"
fi
ret=$?
if [ $ret -ne 0 ] ; then
docker service logs bunkerweb_mybunker
docker service logs bunkerweb_myautoconf
for service in $(docker stack services --format "{{ .Name }}" "$example") ; do
docker service logs "$service"
done
docker config ls
docker stack rm bunkerweb > /dev/null 2>&1
docker stack rm "$example" > /dev/null 2>&1
docker network rm services_net autoconf_net > /dev/null 2>&1
for config in $(docker config ls --format "{{ .ID }}") ; do
docker config rm $config
done
echo "$example failed (curl) ..."
exit 1
fi
done
docker stack rm "$example"
for config in $(docker config ls --format "{{ .ID }}") ; do
docker config rm $config
done
echo "$example success !"
}
echo "Running swarm tests ..."
# Start swarm
if [ ! -d "/tmp/swarm" ] ; then
mkdir /tmp/swarm
fi
rm -rf /tmp/swarm/*
cp -r ./integrations/swarm/* /tmp/swarm
sed -i 's@bunkerity/bunkerweb:.*$@10.20.1.1:5000/bw-tests:latest@g' /tmp/swarm/stack.yml
sed -i 's@bunkerity/bunkerweb-autoconf:.*$@10.20.1.1:5000/bw-autoconf-tests:latest@g' /tmp/swarm/stack.yml
current_dir="$(pwd)"
cd "/tmp/swarm"
echo "starting swarm stack ..."
docker stack rm bunkerweb > /dev/null 2>&1
current_wait=0
while [ 1 ] ; do
if [ $current_wait -gt 30 ] ; then
echo "can't remove old swarm stack"
exit 1
fi
if [ "$(docker stack ls | grep bunkerweb)" = "" ] ; then
break
fi
current_wait=$((current_wait+1))
sleep 1
done
docker network rm services_net autoconf_net > /dev/null 2>&1
ret="$(docker stack deploy -c stack.yml bunkerweb 2>&1)"
if [ $? -ne 0 ] ; then
echo "$ret"
echo "swarm failed (deploy)"
exit 1
fi
current_wait=0
healthy="no"
while [ $current_wait -lt 30 ] ; do
check="$(docker stack ps --no-trunc --format "{{ .CurrentState }}" bunkerweb | grep -v "Running" 2>&1)"
if [ "$check" = "" ] ; then
healthy="yes"
break
fi
current_wait=$((current_wait+1))
sleep 1
done
if [ "$healthy" = "no" ] ; then
echo "$ret"
docker service logs bunkerweb_mybunker
docker service logs bunkerweb_myautoconf
docker stack rm bunkerweb > /dev/null 2>&1
echo "swarm failed (not healthy)"
exit 1
fi
cd "$current_dir"
sleep 60
# reverse
single_swarm_test "swarm-reverse-proxy" "120" "https://$TEST_DOMAIN1 hello" "https://$TEST_DOMAIN2 hello" "https://$TEST_DOMAIN3 hello"
# configs
single_swarm_test "swarm-configs" "120" "https://$TEST_DOMAIN1/app1 app1" "https://$TEST_DOMAIN2/app2 app2" "https://$TEST_DOMAIN3/app3 app3" "https://$TEST_DOMAIN1/hello hello" "https://$TEST_DOMAIN2/hello hello" "https://$TEST_DOMAIN3/hello hello"
# cleanup
current_dir="$(pwd)"
cd "/tmp/swarm"
docker stack rm bunkerweb > /dev/null 2>&1
cd "$current_dir"
exit 0

11
tests/utils/k8s.yml Normal file
View File

@@ -0,0 +1,11 @@
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-bunkerweb
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/tmp/bw-data"

200
tests/utils/utils.sh Normal file
View File

@@ -0,0 +1,200 @@
#!/bin/bash
function exec_docker_example() {
if [ -d "/tmp/tests/$1" ] ; then
sudo rm -rf "/tmp/tests/$1"
if [ $? -ne 0 ] ; then
return 1
fi
fi
if [ ! -d "/tmp/tests" ] ; then
mkdir /tmp/tests
if [ $? -ne 0 ] ; then
return 1
fi
fi
cp -r "examples/$1" "/tmp/tests"
if [ $? -ne 0 ] ; then
return 1
fi
current_dir="$(pwd)"
cd "/tmp/tests/$1"
sed -i 's@bunkerity/bunkerweb:.*$@10.20.1.1:5000/bw-tests:latest@g' docker-compose.yml
sed -i 's@\./bw\-data:/@/tmp/bw\-data:/@g' docker-compose.yml
sed -i 's@- bw_data:/@- /tmp/bw\-data:/@g' docker-compose.yml
sed -i "s@www.example.com@${TEST_DOMAIN1}@g" docker-compose.yml
sed -i "s@app1.example.com@${TEST_DOMAIN1_1}@g" docker-compose.yml
sed -i "s@app2.example.com@${TEST_DOMAIN1_2}@g" docker-compose.yml
sed -i "s@app3.example.com@${TEST_DOMAIN1_3}@g" docker-compose.yml
find "/tmp/tests/$1" -name "www.example.com" -exec /usr/bin/rename "s/www.example.com/${TEST_DOMAIN1}/" {} \+
find "/tmp/tests/$1" -name "app1.example.com" -exec /usr/bin/rename "s/app1.example.com/${TEST_DOMAIN1_1}/" {} \+
find "/tmp/tests/$1" -name "app2.example.com" -exec /usr/bin/rename "s/app2.example.com/${TEST_DOMAIN1_2}/" {} \+
find "/tmp/tests/$1" -name "app3.example.com" -exec /usr/bin/rename "s/app3.example.com/${TEST_DOMAIN1_3}/" {} \+
if [ -f setup.sh ] ; then
sudo ./setup.sh
fi
for folder in $(echo "configs plugins www") ; do
sudo bash -c "find /tmp/bw-data/$folder -type f -exec rm -f {} \;"
done
if [ -d ./bw-data ] ; then
sudo bash -c "cp -a ./bw-data/* /tmp/bw-data"
fi
docker-compose pull > /dev/null 2>&1
ret=$(docker-compose up -d 2>&1)
if [ "$?" -ne 0 ] ; then
sudo docker-compose down -v > /dev/null 2>&1
cd "$current_dir"
sudo rm -rf "/tmp/tests/$1"
echo "$ret"
return 1
fi
cd "$current_dir"
}
function exec_swarm_example() {
if [ -d "/tmp/tests/$1" ] ; then
sudo rm -rf "/tmp/tests/$1"
if [ $? -ne 0 ] ; then
return 1
fi
fi
if [ ! -d "/tmp/tests" ] ; then
mkdir /tmp/tests
if [ $? -ne 0 ] ; then
return 1
fi
fi
cp -r "examples/$1" "/tmp/tests"
if [ $? -ne 0 ] ; then
return 1
fi
current_dir="$(pwd)"
cd "/tmp/tests/$1"
sed -i "s@www.example.com@${TEST_DOMAIN1}@g" stack.yml
sed -i "s@app1.example.com@${TEST_DOMAIN1}@g" stack.yml
sed -i "s@app2.example.com@${TEST_DOMAIN2}@g" stack.yml
sed -i "s@app3.example.com@${TEST_DOMAIN3}@g" stack.yml
sed -i "s@www.example.com@${TEST_DOMAIN1}@g" setup.sh
sed -i "s@app1.example.com@${TEST_DOMAIN1}@g" setup.sh
sed -i "s@app2.example.com@${TEST_DOMAIN2}@g" setup.sh
sed -i "s@app3.example.com@${TEST_DOMAIN3}@g" setup.sh
find "/tmp/tests/$1" -name "www.example.com" -exec /usr/bin/rename "s/www.example.com/${TEST_DOMAIN1}/" {} \+
find "/tmp/tests/$1" -name "app1.example.com" -exec /usr/bin/rename "s/app1.example.com/${TEST_DOMAIN1}/" {} \+
find "/tmp/tests/$1" -name "app2.example.com" -exec /usr/bin/rename "s/app2.example.com/${TEST_DOMAIN2}/" {} \+
find "/tmp/tests/$1" -name "app3.example.com" -exec /usr/bin/rename "s/app3.example.com/${TEST_DOMAIN3}/" {} \+
if [ -f setup.sh ] ; then
sudo ./setup.sh
fi
docker stack rm "$1" > /dev/null 2>&1
docker stack deploy -c stack.yml "$1"
if [ "$?" -ne 0 ] ; then
cd "$current_dir"
sudo rm -rf "/tmp/tests/$1"
return 1
fi
cd "$current_dir"
}
function exec_k8s_example() {
if [ -d "/tmp/tests/$1" ] ; then
sudo rm -rf "/tmp/tests/$1"
if [ $? -ne 0 ] ; then
return 1
fi
fi
if [ ! -d "/tmp/tests" ] ; then
mkdir /tmp/tests
if [ $? -ne 0 ] ; then
return 1
fi
fi
cp -r "examples/$1" "/tmp/tests"
if [ $? -ne 0 ] ; then
return 1
fi
current_dir="$(pwd)"
cd "/tmp/tests/$1"
sed -i "s@www.example.com@${TEST_DOMAIN1}@g" *.yml
sed -i "s@app1.example.com@${TEST_DOMAIN1}@g" *.yml
sed -i "s@app2.example.com@${TEST_DOMAIN2}@g" *.yml
sed -i "s@app3.example.com@${TEST_DOMAIN3}@g" *.yml
find "/tmp/tests/$1" -name "www.example.com" -exec /usr/bin/rename "s/www.example.com/${TEST_DOMAIN1}/" {} \+
find "/tmp/tests/$1" -name "app1.example.com" -exec /usr/bin/rename "s/app1.example.com/${TEST_DOMAIN1}/" {} \+
find "/tmp/tests/$1" -name "app2.example.com" -exec /usr/bin/rename "s/app2.example.com/${TEST_DOMAIN2}/" {} \+
find "/tmp/tests/$1" -name "app3.example.com" -exec /usr/bin/rename "s/app3.example.com/${TEST_DOMAIN3}/" {} \+
if [ -f setup.sh ] ; then
sudo ./setup.sh
fi
for yml in $(ls *.yml) ; do
if [ "$yml" != "ingress.yml" ] ; then
sudo kubectl delete -f "$yml" > /dev/null 2> /dev/null
sudo kubectl apply -f "$yml"
if [ $? -ne 0 ] ; then
cd "$current_dir"
sudo kubectl delete -f "/tmp/tests/$1" > /dev/null 2>&1
rm -rf "/tmp/tests/$1"
return 1
fi
fi
done
sudo kubectl delete -f "ingress.yml" > /dev/null 2> /dev/null
sudo kubectl apply -f "ingress.yml"
if [ "$?" -ne 0 ] ; then
cd "$current_dir"
sudo kubectl delete -f "/tmp/tests/$1" > /dev/null 2>&1
rm -rf "/tmp/tests/$1"
return 1
fi
cd "$current_dir"
}
function curl_assert() {
url="$1"
str="$2"
max_wait=$3
ws="$4"
if [ "$ws" != "" ] ; then
cp ./tests/utils/websocat_amd64-linux /tmp/
chmod +x /tmp/websocat_amd64-linux
fi
current_wait=0
while [ $current_wait -le $max_wait ] ; do
if [ "$ws" = "" ] ; then
data="$(curl -k -L -s --cookie /dev/null -H "User-Agent: LegitOne" "$url" | grep -i "$str")"
else
data="$(echo "test" | /tmp/websocat_amd64-linux - --text wss://test1.bunkerity.com/ws/ | grep -i "$str")"
fi
if [ "$data" != "" ] && [ $? -eq 0 ] ; then
return 0
fi
current_wait=$((current_wait+1))
sleep 1
done
return 1
}
function rm_example() {
if [ ! -d "/tmp/tests/$1" ] ; then
return 1
fi
current_dir="$(pwd)"
cd "/tmp/tests/$1"
sudo docker-compose down -v > /dev/null 2>&1
cd "$current_dir"
sudo rm -rf "/tmp/tests/$1"
}
function do_and_check_cmd() {
if [ "$CHANGE_DIR" != "" ] ; then
cd "$CHANGE_DIR"
fi
output=$("$@" 2>&1)
ret="$?"
if [ $ret -ne 0 ] ; then
echo "❌ Error from command : $*"
echo "$output"
exit $ret
fi
#echo $output
return 0
}

BIN
tests/utils/websocat_amd64-linux Executable file

Binary file not shown.

View File

@@ -1,3 +0,0 @@
HTTP_PORT=80
HTTPS_PORT=443
SERVER_NAME=www.test.com