diff --git a/Makefile b/Makefile index 6b119db..ab43956 100644 --- a/Makefile +++ b/Makefile @@ -8,11 +8,74 @@ define ping ansible-playbook -i $(INVENTORY) -f 10 ./ansible/ping.yml endef +define configure_base + . ./venv/bin/activate && \ + ansible-playbook -i $(INVENTORY) -f 10 ./ansible/playbook.yml +endef + + +define configure_locust + . ./venv/bin/activate && \ + ansible-playbook -i $(INVENTORY) -f 10 ./ansible/locust/main.yml +endef + +define test_base + . ./venv/bin/activate && \ + cd tests/ && \ + pwd && \ + py.test --hosts='ansible://all' \ + -n 10 \ + --verbose \ + --ansible-inventory="../${INVENTORY}" \ + test_basic.py + +endef + +define test_locust + . ./venv/bin/activate && \ + cd tests/locust/ && \ + py.test --hosts='ansible://mcaptcha_dos*' \ + -n 10 \ + --verbose \ + --ansible-inventory="../../${INVENTORY}" \ + base.py +endef + + + +# ```bash +# INVENTORY=./terraform/dos/hosts.ini make conf.base +# ``` +conf.base: ## Get all VMs to base level configuration + $(call configure_base) + + +lint: ## Lint source code + terraform fmt + . ./venv/bin/activate && \ + ansible-lint --write $(find ansible -type f) + . ./venv/bin/activate && black tests/ + +# ```bash +# INVENTORY=./terraform/dos/hosts.ini make conf.base +# ``` +conf.dos: ## Configure all DoS VMs + $(call configure_base) + $(call configure_locust) + # ```bash # INVENTORY=./terraform/dos/hosts.ini make conf.ping # ``` conf.ping: ## Ping all DoS VMs $(call ping) + +test: ## Run all tests + $(call test_base) + $(call test_locust) + +test.base: ## Test base configuration on all VMs + $(call test_base) + help: ## Prints help for targets with comments @cat $(MAKEFILE_LIST) | grep -E '^[a-zA-Z_-].+:.*?## .*$$' | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/ansible/locust/artifacts/docker-compose.yml b/ansible/locust/artifacts/docker-compose.yml new file mode 100644 index 0000000..7fdde51 --- /dev/null +++ b/ansible/locust/artifacts/docker-compose.yml @@ -0,0 +1,23 @@ +--- +version: "3" +services: + master: + image: realaravinth/mcaptcha-dos-locust-protected:latest + container_name: master.locust.thrasher.dos.mcaptcha.org + environment: + - MCAPTCHA_CAPTCHA_SITEKEY=dPGVlwxjyPQJS5OEp86gzNJsxbrMlXwQ + - MCAPTCHA_CAPTCHA_HOST=http://localhost:7000 + - HOST=http://localhost:5000 + ports: + - 8089:8089 + volumes: + - ./data/:/src/data + command: --master -H http://localhost:8089 + worker: + image: realaravinth/mcaptcha-dos-locust-protected:latest + network_mode: host + environment: + - MCAPTCHA_CAPTCHA_SITEKEY=dPGVlwxjyPQJS5OEp86gzNJsxbrMlXwQ + - MCAPTCHA_CAPTCHA_HOST=http://localhost:7000 + - HOST=http://localhost:5000 + command: --worker --master-host localhost diff --git a/ansible/locust/main.yml b/ansible/locust/main.yml new file mode 100644 index 0000000..06f5f97 --- /dev/null +++ b/ansible/locust/main.yml @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: 2023 Aravinth Manivannan +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +--- +- name: Configure Locust instances + hosts: [mcaptcha_dos] + remote_user: atm + pre_tasks: + - name: Ensure all VMs are reachable + ansible.builtin.ping: + roles: + - docker-compose + + tasks: + - name: Allow port 8089 for locust + become: true + community.general.ufw: + state: enabled + rule: allow + proto: tcp + port: "8089" + + - name: Create projects dir + become: true + ansible.builtin.file: + path: /etc/locust + state: directory + mode: "0755" + + - name: Copy docker-compose.yml file + become: true + ansible.builtin.copy: + src: ./artifacts/docker-compose.yml + dest: /etc/locust/ + + - name: Start locust services + become: true + community.docker.docker_compose: + project_src: /etc/locust/ + scale: + worker: 4 diff --git a/ansible/locust/roles/docker-compose/tasks/main.yml b/ansible/locust/roles/docker-compose/tasks/main.yml new file mode 100644 index 0000000..f8f1a02 --- /dev/null +++ b/ansible/locust/roles/docker-compose/tasks/main.yml @@ -0,0 +1,7 @@ +--- +- name: Install docker-compose + become: true + ansible.builtin.apt: + update_cache: true + pkg: + - docker-compose diff --git a/requirements.txt b/requirements.txt index f927207..9363b82 100644 --- a/requirements.txt +++ b/requirements.txt @@ -221,3 +221,69 @@ yt-dlp==2023.7.6 zipp==3.16.2 zope.event==5.0 zope.interface==6.0 +ansible==8.1.0 +ansible-compat==4.1.6 +ansible-core==2.15.1 +ansible-lint==6.17.2 +astroid==2.15.6 +attrs==23.1.0 +black==23.7.0 +bracex==2.3.post1 +certifi==2023.5.7 +cffi==1.15.1 +charset-normalizer==3.2.0 +click==8.1.6 +contextvars==2.4 +cryptography==41.0.2 +dill==0.3.7 +distro==1.8.0 +execnet==2.0.2 +filelock==3.12.2 +gitdb==4.0.10 +GitPython==3.1.32 +idna==3.4 +immutables==0.19 +iniconfig==2.0.0 +isort==5.12.0 +Jinja2==3.1.2 +jmespath==1.0.1 +jsonschema==4.19.0 +jsonschema-specifications==2023.7.1 +lazy-object-proxy==1.9.0 +lint==1.2.1 +looseversion==1.3.0 +markdown-it-py==3.0.0 +MarkupSafe==2.1.3 +mccabe==0.7.0 +mdurl==0.1.2 +msgpack==1.0.5 +mypy-extensions==1.0.0 +packaging==23.1 +pathspec==0.11.2 +platformdirs==3.10.0 +pluggy==1.2.0 +psutil==5.9.5 +pycparser==2.21 +pycryptodomex==3.18.0 +Pygments==2.16.1 +pylint==2.17.5 +pytest==7.4.0 +pytest-testinfra==8.1.0 +pytest-xdist==3.3.1 +PyYAML==6.0 +pyzmq==25.0.2 +referencing==0.30.2 +requests==2.31.0 +resolvelib==1.0.1 +rich==13.5.2 +rpds-py==0.9.2 +ruamel.yaml==0.17.32 +ruamel.yaml.clib==0.2.7 +salt==3006.1 +smmap==5.0.0 +subprocess-tee==0.4.1 +tomlkit==0.12.1 +urllib3==2.0.3 +wcmatch==8.4.1 +wrapt==1.15.0 +yamllint==1.32.0