Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env bash
- set -Eeuo pipefail
- # Build current upstream Greenbone scanner/openvasd and openvas-smb images with
- # debug symbols. The source is fetched at build time; use OPENVAS_REF and
- # OPENVAS_SMB_REF to make a build reproducible.
- ROOT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"
- SOURCE_DIR="${ROOT_DIR}/.openvas-source"
- REGISTRY="${REGISTRY:-local}"
- IMAGE_PREFIX="${IMAGE_PREFIX:-openvas}"
- IMAGE_VERSION="${IMAGE_VERSION:-${VERSION:-latest}}"
- OPENVAS_REF="${OPENVAS_REF:-main}"
- OPENVAS_SMB_REF="${OPENVAS_SMB_REF:-main}"
- PLATFORM="${PLATFORM:-linux/amd64}"
- BUILDER="${BUILDER:-openvas-debug-builder}"
- PUSH="${PUSH:-0}"
- NO_CACHE="${NO_CACHE:-0}"
- SKIP_DOCKER_INSTALL="${SKIP_DOCKER_INSTALL:-0}"
- BUILD_FULL_STACK="${BUILD_FULL_STACK:-1}"
- COMPOSE_FILE="${COMPOSE_FILE:-${ROOT_DIR}/docker-compose.debug.yml}"
- SCANNER_IMAGE="${REGISTRY}/${IMAGE_PREFIX}-scanner:debug"
- SMB_IMAGE="${REGISTRY}/${IMAGE_PREFIX}-smb:debug"
- if [[ "${EUID}" -eq 0 ]]; then
- ROOT_CMD=()
- else
- command -v sudo >/dev/null || {
- echo "ERROR: run as root or install sudo" >&2
- exit 1
- }
- ROOT_CMD=(sudo)
- fi
- build_debug_component() {
- local name="$1" repo="$2" ref="$3" image="$4" base_image="${5:-}"
- local source="${SOURCE_DIR}/${name}"
- local upstream_dockerfile debug_dockerfile
- echo "Fetching ${name} (${ref})..."
- clone_or_update "${repo}" "${ref}" "${source}"
- upstream_dockerfile="${source}/.docker/prod.Dockerfile"
- if [[ ! -f "${upstream_dockerfile}" ]]; then
- upstream_dockerfile="$(find "${source}/.docker" -maxdepth 1 -type f -name 'prod*.Dockerfile' | sort | head -n 1)"
- fi
- debug_dockerfile="${source}/.docker/debug.Dockerfile"
- # gvm-auth-lib currently has no upstream container Dockerfile. Build its
- # Rust library and C wrapper directly on Debian 13 instead.
- if [[ -z "${upstream_dockerfile}" && "${name}" == gvm-auth-lib ]]; then
- cat > "${debug_dockerfile}" <<'EOF'
- FROM rust:bookworm AS build
- RUN apt-get update && apt-get install --no-install-recommends -y \
- build-essential cmake pkg-config libssl-dev libc6-dev clang \
- python3 ca-certificates && rm -rf /var/lib/apt/lists/*
- COPY . /source
- WORKDIR /source
- RUN cargo build && \
- cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=OFF -DBUILD_TESTS=OFF \
- -DCMAKE_INSTALL_PREFIX=/usr/local -B/build /source && \
- DESTDIR=/install cmake --build /build -j"$(nproc)" -- install
- FROM debian:13-slim
- COPY --from=build /install/ /
- RUN ldconfig
- ENV RUST_BACKTRACE=full RUST_LOG=debug G_LOG_LEVEL=debug
- EOF
- elif [[ -z "${upstream_dockerfile}" ]]; then
- echo "ERROR: no production Dockerfile found for ${name}" >&2
- return 1
- else
- sed \
- -e 's/CMAKE_BUILD_TYPE=Release/CMAKE_BUILD_TYPE=Debug/g' \
- -e 's/cargo build --release/cargo build/g' \
- -e 's#target/release/#target/debug/#g' \
- -e 's#FROM registry.community.greenbone.net/community/openvas-scanner:${VERSION}#FROM ${OPENVAS_SCANNER_IMAGE}#g' \
- -e '/^CMD /i ENV RUST_BACKTRACE=full RUST_LOG=debug G_LOG_LEVEL=debug PYTHONUNBUFFERED=1 NODE_ENV=development' \
- "${upstream_dockerfile}" > "${debug_dockerfile}"
- if [[ -n "${base_image}" ]]; then
- sed -i '1i ARG OPENVAS_SCANNER_IMAGE' "${debug_dockerfile}"
- fi
- fi
- local args=(--platform "${PLATFORM}" --file "${debug_dockerfile}" --tag "${image}" \
- --build-arg VERSION="${IMAGE_VERSION}" --build-arg GVM_LIBS_VERSION=stable \
- --build-arg BUILDKIT_INLINE_CACHE=1 \
- --label "org.opencontainers.image.title=${name}-debug")
- [[ "${NO_CACHE}" == 1 ]] && args+=(--no-cache)
- [[ -n "${base_image}" ]] && args+=(--build-arg "OPENVAS_SCANNER_IMAGE=${base_image}")
- DOCKER_BUILDKIT=1 docker build "${args[@]}" "${source}"
- }
- write_compose_file() {
- cat > "${COMPOSE_FILE}" <<EOF
- services:
- postgres:
- image: postgres:16
- restart: unless-stopped
- environment:
- POSTGRES_DB: gvmd
- POSTGRES_USER: gvmd
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-this-password}
- volumes:
- - pgdata:/var/lib/postgresql/data
- redis:
- image: redis:7-alpine
- restart: unless-stopped
- volumes:
- - redisdata:/data
- gvmd:
- image: ${REGISTRY}/${IMAGE_PREFIX}-gvmd:debug
- depends_on: [postgres, redis, ospd-openvas]
- volumes:
- - gvmd-run:/run/gvmd
- - gvm-data:/var/lib/gvm
- - gvmd-logs:/var/log/gvm
- ospd-openvas:
- image: ${REGISTRY}/${IMAGE_PREFIX}-ospd-openvas:debug
- depends_on: [scanner]
- privileged: true
- volumes:
- - ospd-run:/run/ospd
- - gvm-data:/var/lib/gvm
- - ospd-logs:/var/log/gvm
- scanner:
- image: ${SCANNER_IMAGE}
- privileged: true
- volumes:
- - gvm-data:/var/lib/gvm
- gsad:
- image: ${REGISTRY}/${IMAGE_PREFIX}-gsad:debug
- depends_on: [gvmd]
- ports:
- - "${GSAD_PORT:-9392}:9392"
- volumes:
- - gvmd-run:/run/gvmd
- - gsad-run:/run/gsad
- gsa:
- image: ${REGISTRY}/${IMAGE_PREFIX}-gsa:debug
- depends_on: [gsad]
- ports:
- - "${GSA_PORT:-8080}:80"
- feed-sync:
- image: registry.community.greenbone.net/community/vulnerability-tests
- environment:
- FEED_RELEASE: "24.10"
- KEEP_ALIVE: 1
- volumes:
- - gvm-data:/mnt
- volumes:
- pgdata:
- redisdata:
- gvm-data:
- gvmd-run:
- gvmd-logs:
- ospd-run:
- ospd-logs:
- gsad-run:
- EOF
- }
- if [[ "${SKIP_DOCKER_INSTALL}" != 1 ]]; then
- [[ -r /etc/os-release ]] || {
- echo "ERROR: /etc/os-release not found; Debian 13 is required" >&2
- exit 1
- }
- # shellcheck disable=SC1091
- . /etc/os-release
- [[ "${ID:-}" == debian && "${VERSION_ID:-}" == 13* ]] || {
- echo "ERROR: this script supports Debian 13 (trixie); found ${PRETTY_NAME:-unknown}" >&2
- echo "Set SKIP_DOCKER_INSTALL=1 only if Docker and dependencies are already installed." >&2
- exit 1
- }
- echo "Installing Debian 13 prerequisites and Docker Engine..."
- "${ROOT_CMD[@]}" apt-get update
- "${ROOT_CMD[@]}" apt-get install -y --no-install-recommends \
- ca-certificates curl git gnupg
- "${ROOT_CMD[@]}" install -m 0755 -d /etc/apt/keyrings
- curl -fsSL https://download.docker.com/linux/debian/gpg | \
- "${ROOT_CMD[@]}" gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
- "${ROOT_CMD[@]}" chmod a+r /etc/apt/keyrings/docker.gpg
- arch="$(dpkg --print-architecture)"
- cat <<EOF | "${ROOT_CMD[@]}" tee /etc/apt/sources.list.d/docker.list >/dev/null
- deb [arch=${arch} signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian trixie stable
- EOF
- "${ROOT_CMD[@]}" apt-get update
- "${ROOT_CMD[@]}" apt-get install -y --no-install-recommends \
- docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- if command -v systemctl >/dev/null && systemctl is-system-running >/dev/null 2>&1; then
- "${ROOT_CMD[@]}" systemctl enable --now docker
- fi
- fi
- command -v docker >/dev/null || { echo "ERROR: docker is required" >&2; exit 1; }
- command -v git >/dev/null || { echo "ERROR: git is required" >&2; exit 1; }
- docker buildx version >/dev/null || {
- echo "ERROR: Docker Buildx plugin is unavailable" >&2
- exit 1
- }
- docker info >/dev/null || {
- echo "ERROR: Docker daemon is not running or is inaccessible" >&2
- exit 1
- }
- mkdir -p "${SOURCE_DIR}"
- clone_or_update() {
- local repo="$1" ref="$2" destination="$3"
- if [[ -d "${destination}/.git" ]]; then
- git -C "${destination}" fetch --depth 1 origin "${ref}"
- git -C "${destination}" checkout --detach FETCH_HEAD
- else
- git clone --depth 1 --branch "${ref}" "${repo}" "${destination}"
- fi
- }
- echo "Fetching openvas-scanner (${OPENVAS_REF})..."
- clone_or_update \
- https://github.com/greenbone/openvas-scanner.git \
- "${OPENVAS_REF}" "${SOURCE_DIR}/openvas-scanner"
- echo "Fetching openvas-smb (${OPENVAS_SMB_REF})..."
- clone_or_update \
- https://github.com/greenbone/openvas-smb.git \
- "${OPENVAS_SMB_REF}" "${SOURCE_DIR}/openvas-smb"
- SCANNER_COMMIT="$(git -C "${SOURCE_DIR}/openvas-scanner" rev-parse HEAD)"
- SMB_COMMIT="$(git -C "${SOURCE_DIR}/openvas-smb" rev-parse HEAD)"
- docker buildx inspect "${BUILDER}" >/dev/null 2>&1 || \
- docker buildx create --name "${BUILDER}" --use
- docker buildx use "${BUILDER}"
- COMMON_ARGS=(--builder "${BUILDER}" --platform "${PLATFORM}")
- [[ "${PUSH}" == 1 ]] && COMMON_ARGS+=(--push) || COMMON_ARGS+=(--load)
- [[ "${NO_CACHE}" == 1 ]] && COMMON_ARGS+=(--no-cache)
- echo "Building ${SMB_IMAGE}"
- DEBUG_SMB_DOCKERFILE="${SOURCE_DIR}/openvas-smb/.docker/debug.Dockerfile"
- sed \
- -e 's/CMAKE_BUILD_TYPE=Release/CMAKE_BUILD_TYPE=Debug/g' \
- "${SOURCE_DIR}/openvas-smb/.docker/prod.Dockerfile" > "${DEBUG_SMB_DOCKERFILE}"
- docker buildx build "${COMMON_ARGS[@]}" \
- --file "${DEBUG_SMB_DOCKERFILE}" \
- --build-arg VERSION="${IMAGE_VERSION}" \
- --build-arg BUILDKIT_INLINE_CACHE=1 \
- --label org.opencontainers.image.title=openvas-smb-debug \
- --label org.opencontainers.image.revision="${SMB_COMMIT}" \
- --tag "${SMB_IMAGE}" \
- "${SOURCE_DIR}/openvas-smb"
- # Keep the upstream Dockerfile intact and patch only the build mode in a
- # generated copy. The upstream file builds both the C scanner and openvasd.
- DEBUG_DOCKERFILE="${SOURCE_DIR}/openvas-scanner/.docker/debug.Dockerfile"
- sed \
- -e 's/cargo build --release/cargo build/g' \
- -e 's#target/release/#target/debug/#g' \
- -e 's/CMAKE_BUILD_TYPE=Release/CMAKE_BUILD_TYPE=Debug/g' \
- -e '/^CMD \["\/usr\/local\/bin\/openvasd"\]/i ENV RUST_BACKTRACE=full RUST_LOG=debug OPENVAS_LOG_LEVEL=debug OPENVASD_LOG_LEVEL=debug' \
- "${SOURCE_DIR}/openvas-scanner/.docker/prod.Dockerfile" > "${DEBUG_DOCKERFILE}"
- echo "Building ${SCANNER_IMAGE}"
- if [[ "${PUSH}" == 1 ]]; then
- docker buildx build "${COMMON_ARGS[@]}" \
- --file "${DEBUG_DOCKERFILE}" \
- --build-arg VERSION="${IMAGE_VERSION}" \
- --build-arg OPENVAS_SMB_IMAGE="${SMB_IMAGE}" \
- --build-arg BUILDKIT_INLINE_CACHE=1 \
- --label org.opencontainers.image.title=openvas-scanner-debug \
- --label org.opencontainers.image.revision="${SCANNER_COMMIT}" \
- --label org.opencontainers.image.openvas-smb-revision="${SMB_COMMIT}" \
- --tag "${SCANNER_IMAGE}" \
- "${SOURCE_DIR}/openvas-scanner"
- else
- # The docker-container Buildx driver cannot see images loaded into the host
- # Docker image store. Use the host builder here so the locally built SMB
- # image can be used by the scanner build without a registry.
- DOCKER_BUILDKIT=1 docker build \
- --platform "${PLATFORM}" \
- --file "${DEBUG_DOCKERFILE}" \
- --build-arg VERSION="${IMAGE_VERSION}" \
- --build-arg OPENVAS_SMB_IMAGE="${SMB_IMAGE}" \
- --build-arg BUILDKIT_INLINE_CACHE=1 \
- --label org.opencontainers.image.title=openvas-scanner-debug \
- --label org.opencontainers.image.revision="${SCANNER_COMMIT}" \
- --label org.opencontainers.image.openvas-smb-revision="${SMB_COMMIT}" \
- --tag "${SCANNER_IMAGE}" \
- "${SOURCE_DIR}/openvas-scanner"
- fi
- if [[ "${BUILD_FULL_STACK}" == 1 ]]; then
- build_debug_component gvm-libs \
- https://github.com/greenbone/gvm-libs.git main \
- "${REGISTRY}/${IMAGE_PREFIX}-gvm-libs:debug"
- build_debug_component gvm-auth-lib \
- https://github.com/greenbone/gvm-auth-lib.git main \
- "${REGISTRY}/${IMAGE_PREFIX}-gvm-auth-lib:debug"
- build_debug_component gvmd \
- https://github.com/greenbone/gvmd.git main \
- "${REGISTRY}/${IMAGE_PREFIX}-gvmd:debug"
- build_debug_component gsad \
- https://github.com/greenbone/gsad.git main \
- "${REGISTRY}/${IMAGE_PREFIX}-gsad:debug"
- build_debug_component ospd-openvas \
- https://github.com/greenbone/ospd-openvas.git main \
- "${REGISTRY}/${IMAGE_PREFIX}-ospd-openvas:debug" "${SCANNER_IMAGE}"
- build_debug_component gsa \
- https://github.com/greenbone/gsa.git main \
- "${REGISTRY}/${IMAGE_PREFIX}-gsa:debug"
- write_compose_file
- echo "Generated Compose file: ${COMPOSE_FILE}"
- fi
- echo
- echo "Built images:"
- echo " ${SMB_IMAGE}"
- echo " ${SCANNER_IMAGE}"
- if [[ "${BUILD_FULL_STACK}" == 1 ]]; then
- echo " ${REGISTRY}/${IMAGE_PREFIX}-gvm-libs:debug"
- echo " ${REGISTRY}/${IMAGE_PREFIX}-gvm-auth-lib:debug"
- echo " ${REGISTRY}/${IMAGE_PREFIX}-gvmd:debug"
- echo " ${REGISTRY}/${IMAGE_PREFIX}-gsad:debug"
- echo " ${REGISTRY}/${IMAGE_PREFIX}-ospd-openvas:debug"
- echo " ${REGISTRY}/${IMAGE_PREFIX}-gsa:debug"
- fi
- echo "Scanner commit: ${SCANNER_COMMIT}"
- echo "SMB commit: ${SMB_COMMIT}"
- echo
- echo "Run scanner debugging with:"
- echo " docker run --rm -it --cap-add NET_ADMIN --cap-add NET_RAW ${SCANNER_IMAGE}"
Add Comment
Please, Sign In to add comment