#!/bin/bash # Wazuh package generator # Copyright (C) 2023, Wazuh Inc. # # This program is a free software; you can redistribute it # and/or modify it under the terms of the GNU General Public # License (version 2) as published by the FSF - Free Software # Foundation. IMAGE_TAG=4.14.5 WAZUH_CURRENT_VERSION=$(curl --silent https://api.github.com/repos/wazuh/wazuh/releases/latest | grep '["]tag_name["]:' | sed -E 's/.*\"([^\"]+)\".*/\1/' | cut -c 2- | sed -e 's/\.//g') WAZUH_REGISTRY=docker.io WAZUH_IMAGE_VERSION="4.14.5" WAZUH_TAG_REVISION="1" WAZUH_DEV_STAGE="" FILEBEAT_MODULE_VERSION="0.5" # ----------------------------------------------------------------------------- trap ctrl_c INT clean() { exit_code=$1 exit ${exit_code} } ctrl_c() { clean 1 } # ----------------------------------------------------------------------------- build() { WAZUH_VERSION="$(echo $WAZUH_IMAGE_VERSION | sed -e 's/\.//g')" FILEBEAT_TEMPLATE_BRANCH="${WAZUH_IMAGE_VERSION}" WAZUH_FILEBEAT_MODULE="wazuh-filebeat-${FILEBEAT_MODULE_VERSION}.tar.gz" WAZUH_UI_REVISION="${WAZUH_TAG_REVISION}" if [ "${WAZUH_DEV_STAGE}" ];then FILEBEAT_TEMPLATE_BRANCH="v${FILEBEAT_TEMPLATE_BRANCH}-${WAZUH_DEV_STAGE,,}" IMAGE_TAG="${WAZUH_IMAGE_VERSION}-${WAZUH_DEV_STAGE,,}" if ! curl --output /dev/null --silent --head --fail "https://github.com/wazuh/wazuh/tree/${FILEBEAT_TEMPLATE_BRANCH}"; then echo "The indicated branch does not exist in the wazuh/wazuh repository: ${FILEBEAT_TEMPLATE_BRANCH}" clean 1 fi else if curl --output /dev/null --silent --head --fail "https://github.com/wazuh/wazuh/tree/v${FILEBEAT_TEMPLATE_BRANCH}"; then FILEBEAT_TEMPLATE_BRANCH="v${FILEBEAT_TEMPLATE_BRANCH}" IMAGE_TAG="${WAZUH_IMAGE_VERSION}" elif curl --output /dev/null --silent --head --fail "https://github.com/wazuh/wazuh/tree/${FILEBEAT_TEMPLATE_BRANCH}"; then FILEBEAT_TEMPLATE_BRANCH="${FILEBEAT_TEMPLATE_BRANCH}" IMAGE_TAG="${WAZUH_IMAGE_VERSION}" else echo "The indicated branch does not exist in the wazuh/wazuh repository: ${FILEBEAT_TEMPLATE_BRANCH}" clean 1 fi fi echo WAZUH_VERSION=$WAZUH_IMAGE_VERSION > ../.env echo WAZUH_IMAGE_VERSION=$WAZUH_IMAGE_VERSION >> ../.env echo WAZUH_TAG_REVISION=$WAZUH_TAG_REVISION >> ../.env echo FILEBEAT_TEMPLATE_BRANCH=$FILEBEAT_TEMPLATE_BRANCH >> ../.env echo WAZUH_FILEBEAT_MODULE=$WAZUH_FILEBEAT_MODULE >> ../.env echo WAZUH_UI_REVISION=$WAZUH_UI_REVISION >> ../.env echo WAZUH_REGISTRY=$WAZUH_REGISTRY >> ../.env echo IMAGE_TAG=$IMAGE_TAG >> ../.env set -a source ../.env set +a # Define all available components local all_components=("wazuh-indexer" "wazuh-manager" "wazuh-dashboard" "wazuh-agent") local components_to_build=() # Determine which components to build if [ -z "${WAZUH_COMPONENT}" ]; then echo "No component specified. Building all components..." components_to_build=("${all_components[@]}") else # Validate component case "${WAZUH_COMPONENT}" in wazuh-indexer|wazuh-manager|wazuh-dashboard|wazuh-agent) components_to_build=("${WAZUH_COMPONENT}") ;; *) echo "Error: Unknown component '${WAZUH_COMPONENT}'" >&2 clean 1 ;; esac fi # Determine build command and base options if [ "${MULTIARCH}" ]; then build_cmd="docker buildx build --platform linux/amd64,linux/arm64 --push --no-cache" else build_cmd="docker build --no-cache" fi # Build each component for component in "${components_to_build[@]}"; do echo "Building ${component} image..." # Build common args (used by all components) build_args=( -t "${WAZUH_REGISTRY}/wazuh/${component}:${IMAGE_TAG}" --build-arg WAZUH_VERSION="${WAZUH_IMAGE_VERSION}" --build-arg WAZUH_TAG_REVISION="${WAZUH_TAG_REVISION}" ) # Add component-specific args case "${component}" in wazuh-indexer) # No additional args for wazuh-indexer ;; wazuh-manager) build_args+=( --build-arg FILEBEAT_TEMPLATE_BRANCH="${FILEBEAT_TEMPLATE_BRANCH}" --build-arg WAZUH_FILEBEAT_MODULE="${WAZUH_FILEBEAT_MODULE}" ) ;; wazuh-dashboard) build_args+=( --build-arg WAZUH_UI_REVISION="${WAZUH_UI_REVISION}" ) ;; wazuh-agent) # No additional args for wazuh-agent ;; esac # Execute build $build_cmd "${build_args[@]}" ${component}/ || clean 1 echo "${component} image built successfully!" done echo "" echo "Image build process completed!" return 0 } # ----------------------------------------------------------------------------- help() { echo echo "Usage: $0 [OPTIONS]" echo echo " -d, --dev [Optional] Set the development stage you want to build, example rc4 or beta1, not used by default." echo " -f, --filebeat-module [Optional] Set Filebeat module version. By default ${FILEBEAT_MODULE_VERSION}." echo " -r, --revision [Optional] Package revision. By default ${WAZUH_TAG_REVISION}" echo " -rg, --registry [Optional] Set the Docker registry to push the images." echo " -c, --component [Required] Set the Wazuh component to build. Accepted values: 'wazuh-indexer', 'wazuh-manager', 'wazuh-dashboard', 'wazuh-agent'." echo " -v, --version [Optional] Set the Wazuh version should be builded. By default, ${WAZUH_IMAGE_VERSION}." echo " -m, --multiarch [Optional] Enable multi-architecture builds." echo " -h, --help Show this help." echo exit $1 } # ----------------------------------------------------------------------------- main() { while [ -n "${1}" ] do case "${1}" in "-h"|"--help") help 0 ;; "-d"|"--dev") if [ -n "${2}" ]; then WAZUH_DEV_STAGE="${2}" shift 2 else help 1 fi ;; "-f"|"--filebeat-module") if [ -n "${2}" ]; then FILEBEAT_MODULE_VERSION="${2}" shift 2 else help 1 fi ;; "-m"|"--multiarch") MULTIARCH="true" shift ;; "-r"|"--revision") if [ -n "${2}" ]; then WAZUH_TAG_REVISION="${2}" shift 2 else help 1 fi ;; "-rg"|"--registry") if [ -n "${2}" ]; then WAZUH_REGISTRY="${2}" shift 2 else help 1 fi ;; "-v"|"--version") if [ -n "$2" ]; then WAZUH_IMAGE_VERSION="$2" shift 2 else help 1 fi ;; "-c"|"--component") if [ -n "${2}" ]; then WAZUH_COMPONENT="${2}" shift 2 else help 1 fi ;; *) help 1 esac done build || clean 1 clean 0 } main "$@"