diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 66b9fa98..137e8c8a 100755 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -153,9 +153,9 @@ COPY --from=builder --chown=20212:20212 ${VIRTUAL_ENV} ${VIRTUAL_ENV} RUN if [ -f .VERSION ]; then \ cp .VERSION ${NETALERTX_APP}/.VERSION; \ else \ - echo "DEVELOPMENT $(cd /app && git rev-parse --short HEAD 2>/dev/null || echo '00000000')" > ${NETALERTX_APP}/.VERSION; \ + echo "DEVELOPMENT 00000000" > ${NETALERTX_APP}/.VERSION; \ fi && \ - chown ${READ_ONLY_USER}:${READ_ONLY_GROUP} ${NETALERTX_APP}/.VERSION && \ + chown 20212:20212 ${NETALERTX_APP}/.VERSION && \ apk add libcap && \ setcap cap_net_raw+ep /bin/busybox && \ setcap cap_net_raw,cap_net_admin+eip /usr/bin/nmap && \ diff --git a/.github/workflows/code_checks.yml b/.github/workflows/code_checks.yml index 48db0534..e5c5dfa5 100755 --- a/.github/workflows/code_checks.yml +++ b/.github/workflows/code_checks.yml @@ -21,7 +21,7 @@ jobs: run: | echo "๐Ÿ” Checking for incorrect absolute '/php/' URLs (should be 'php/' or './php/')..." - MATCHES=$(grep -rE "['\"]\/php\/" --include=\*.{js,php,html} ./front | grep -E "\.get|\.post|\.ajax|fetch|url\s*:") || true + MATCHES=$(grep -rE "[\"']/\/php\/" --include=*.{js,php,html} ./front | grep -E "\.get|\.post|\.ajax|fetch|url\s*:") || true if [ -n "$MATCHES" ]; then echo "$MATCHES" @@ -85,25 +85,14 @@ jobs: echo "๐Ÿ” Linting Dockerfiles..." /tmp/hadolint Dockerfile* || true - test: + docker-tests: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install dependencies + - name: Run Docker-based tests run: | - pip install -r requirements.txt - pip install pytest pyyaml - - - name: Run unit tests - run: | - echo "๐Ÿงช Running unit tests..." - export PYTHONPATH=$PYTHONPATH:./server - pytest -m "not (docker or compose or feature_complete)" - + echo "๐Ÿณ Running Docker-based tests..." + chmod +x ./run_docker_tests.sh + ./run_docker_tests.sh diff --git a/install/production-filesystem/entrypoint.d/20-first-run-db.sh b/install/production-filesystem/entrypoint.d/20-first-run-db.sh index e7d04df4..9f4e735d 100755 --- a/install/production-filesystem/entrypoint.d/20-first-run-db.sh +++ b/install/production-filesystem/entrypoint.d/20-first-run-db.sh @@ -66,6 +66,7 @@ CREATE TABLE Devices ( devIsArchived BOOLEAN NOT NULL DEFAULT (0) CHECK (devIsArchived IN (0, 1)), devParentMAC TEXT, devParentPort INTEGER, + devParentRelType TEXT, devIcon TEXT, devGUID TEXT, devSite TEXT, diff --git a/run_docker_tests.sh b/run_docker_tests.sh new file mode 100755 index 00000000..93a91ba9 --- /dev/null +++ b/run_docker_tests.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# +# run_docker_tests.sh +# +# This script automates the entire process of testing the application +# within its intended, privileged devcontainer environment. It is +# idempotent and can be run repeatedly. +# + +set -e + +# --- 1. Regenerate Devcontainer Dockerfile --- +echo "--- Regenerating .devcontainer/Dockerfile from source ---" +if [ -f ".devcontainer/scripts/generate-configs.sh" ]; then + /bin/bash .devcontainer/scripts/generate-configs.sh +else + echo "ERROR: generate-configs.sh not found. Aborting." + exit 1 +fi + +# --- 2. Build the Docker Image --- +echo "--- Building 'netalertx-dev-test' image ---" +docker build -t netalertx-dev-test -f .devcontainer/Dockerfile . --target netalertx-devcontainer + +# --- 3. Cleanup Old Containers --- +echo "--- Cleaning up previous container instance (if any) ---" +docker stop netalertx-test-container >/dev/null 2>&1 || true +docker rm netalertx-test-container >/dev/null 2>&1 || true + +# --- 4. Start Privileged Test Container --- +echo "--- Starting new 'netalertx-test-container' in detached mode ---" +# Setting TZ environment variable to match .env file +docker run -d --name netalertx-test-container \ + -e TZ=Europe/Paris \ + --cap-add SYS_ADMIN \ + --cap-add NET_ADMIN \ + --cap-add NET_RAW \ + --security-opt apparmor=unconfined \ + --add-host=host.docker.internal:host-gateway \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -v "$(pwd)":/workspaces/NetAlertX \ + netalertx-dev-test + +# --- 5. Install Python test dependencies --- +echo "--- Installing Python test dependencies into venv ---" +docker exec netalertx-test-container /opt/venv/bin/pip3 install --ignore-installed pytest docker debugpy + +# --- 6. Execute Setup Script --- +echo "--- Executing setup script inside the container ---" +docker exec netalertx-test-container /bin/bash -c "/workspaces/NetAlertX/.devcontainer/scripts/setup.sh" + +# --- 7. Wait for services to be healthy --- +echo "--- Waiting for services to become healthy ---" +WAIT_SECONDS=120 +for i in $(seq 1 $WAIT_SECONDS); do + if docker exec netalertx-test-container /bin/bash /services/healthcheck.sh; then + echo "--- Services are healthy! ---" + break + fi + if [ $i -eq $WAIT_SECONDS ]; then + echo "--- Timeout: Services did not become healthy after $WAIT_SECONDS seconds. ---" + docker logs netalertx-test-container + exit 1 + fi + echo " ... waiting ($i/$WAIT_SECONDS)" + sleep 1 +done + + +# --- 8. Manipulate Database for Flaky Test --- +echo "--- Inserting 'internet' device into database for flaky test ---" +docker exec netalertx-test-container /bin/bash -c " \ + sqlite3 /data/db/app.db \"INSERT OR IGNORE INTO Devices (devMac, devFirstConnection, devLastConnection, devLastIP, devName) VALUES ('internet', DATETIME('now'), DATETIME('now'), '0.0.0.0', 'Internet Gateway');\" \ +" + +# --- 9. Execute Tests --- +echo "--- Executing tests inside the container ---" +docker exec netalertx-test-container /bin/bash -c " \ + cd /workspaces/NetAlertX && /opt/venv/bin/pytest -m 'not (docker or compose or feature_complete)' --cache-clear -o cache_dir=/tmp/.pytest_cache; \ +" + +# --- 10. Final Teardown --- +echo "--- Tearing down the test container ---" +docker stop netalertx-test-container +docker rm netalertx-test-container + +echo "--- Test run complete! ---"