diff --git a/bitnami/logstash/7/debian-10/Dockerfile b/bitnami/logstash/7/debian-10/Dockerfile new file mode 100644 index 000000000000..2928fa283595 --- /dev/null +++ b/bitnami/logstash/7/debian-10/Dockerfile @@ -0,0 +1,29 @@ +FROM bitnami/minideb:buster +LABEL maintainer "Bitnami " + +ENV HOME="/" \ + OS_ARCH="amd64" \ + OS_FLAVOUR="debian-10" \ + OS_NAME="linux" + +COPY prebuildfs / +# Install required system packages and dependencies +RUN install_packages ca-certificates curl libc6 libgcc1 procps sudo unzip zlib1g +RUN . ./libcomponent.sh && component_unpack "logstash" "7.5.2-0" --checksum 34be4d129d53b8388a710298e70879beba1b98b491aa7698981ab0a32e95c59d +RUN . ./libcomponent.sh && component_unpack "java" "1.8.242-0" --checksum 3a70f3d1c3cd9bc6ec581b2a10373a2b323c0b9af40402ce8d19aeb0b3d02400 +RUN apt-get update && apt-get upgrade && \ + rm -r /var/lib/apt/lists /var/cache/apt/archives +RUN /build/install-gosu.sh + +COPY rootfs / +RUN /postunpack.sh +ENV BITNAMI_APP_NAME="logstash" \ + BITNAMI_IMAGE_VERSION="7.5.2-debian-10-r0" \ + PATH="/opt/bitnami/logstash/bin:/opt/bitnami/java/bin:$PATH" + +EXPOSE 8080 + +WORKDIR /opt/bitnami/logstash +USER 1001 +ENTRYPOINT [ "/entrypoint.sh" ] +CMD [ "/run.sh" ] diff --git a/bitnami/logstash/7/debian-10/docker-compose.yml b/bitnami/logstash/7/debian-10/docker-compose.yml new file mode 100644 index 000000000000..1d449e3a0e7b --- /dev/null +++ b/bitnami/logstash/7/debian-10/docker-compose.yml @@ -0,0 +1,11 @@ +version: '2' +services: + logstash: + image: bitnami/logstash:7 + ports: + - 8080:8080 + volumes: + - logstash_data:/bitnami +volumes: + logstash_data: + driver: local diff --git a/bitnami/logstash/7/debian-10/prebuildfs/build/install-gosu.sh b/bitnami/logstash/7/debian-10/prebuildfs/build/install-gosu.sh new file mode 100755 index 000000000000..1756700daa89 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/build/install-gosu.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +VERSION="1.11" +SHA256="0b843df6d86e270c5b0f5cbd3c326a04e18f4b7f9b8457fa497b0454c4b138d7" + +curl --silent -L "https://github.com/tianon/gosu/releases/download/${VERSION}/gosu-amd64" > "/usr/local/bin/gosu" +echo "$SHA256" "/usr/local/bin/gosu" | sha256sum --check +chmod u+x "/usr/local/bin/gosu" +mkdir -p "/opt/bitnami/licenses" +curl --silent -L "https://raw.githubusercontent.com/tianon/gosu/master/LICENSE" > "/opt/bitnami/licenses/gosu-${VERSION}.txt" diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libbitnami.sh b/bitnami/logstash/7/debian-10/prebuildfs/libbitnami.sh new file mode 100644 index 000000000000..529c3fd4a3e2 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libbitnami.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# Bitnami custom library + +# Load Generic Libraries +. /liblog.sh + +# Constants +BOLD='\033[1m' + +# Functions + +######################## +# Print the welcome page +# Globals: +# DISABLE_WELCOME_MESSAGE +# BITNAMI_APP_NAME +# Arguments: +# None +# Returns: +# None +######################### +print_welcome_page() { + if [[ -z "${DISABLE_WELCOME_MESSAGE:-}" ]]; then + if [[ -n "$BITNAMI_APP_NAME" ]]; then + print_image_welcome_page + fi + fi +} + +######################## +# Print the welcome page for a Bitnami Docker image +# Globals: +# BITNAMI_APP_NAME +# Arguments: +# None +# Returns: +# None +######################### +print_image_welcome_page() { + local github_url="https://github.com/bitnami/bitnami-docker-${BITNAMI_APP_NAME}" + + log "" + log "${BOLD}Welcome to the Bitnami ${BITNAMI_APP_NAME} container${RESET}" + log "Subscribe to project updates by watching ${BOLD}${github_url}${RESET}" + log "Submit issues and feature requests at ${BOLD}${github_url}/issues${RESET}" + log "Send us your feedback at ${BOLD}containers@bitnami.com${RESET}" + log "" +} + diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libcomponent.sh b/bitnami/logstash/7/debian-10/prebuildfs/libcomponent.sh new file mode 100644 index 000000000000..025288664f69 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libcomponent.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# +# Library for managing Bitnami components + +# Constants +CACHE_ROOT="/tmp/bitnami/pkg/cache" +DOWNLOAD_URL="https://downloads.bitnami.com/files/stacksmith" + +# Functions + +######################## +# Download and unpack a Bitnami package +# Globals: +# OS_NAME +# OS_ARCH +# OS_FLAVOUR +# Arguments: +# $1 - component's name +# $2 - component's version +# Returns: +# None +######################### +component_unpack() { + local name="${1:?name is required}" + local version="${2:?version is required}" + local base_name="${name}-${version}-${OS_NAME}-${OS_ARCH}-${OS_FLAVOUR}" + local package_sha256="" + + # Validate arguments + shift 2 + while [ "$#" -gt 0 ]; do + case "$1" in + -c|--checksum) + shift + package_sha256="${1:?missing package checksum}" + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + + echo "Downloading $base_name package" + if [ -f "${CACHE_ROOT}/${base_name}.tar.gz" ]; then + echo "${CACHE_ROOT}/${base_name}.tar.gz already exists, skipping download." + cp "${CACHE_ROOT}/${base_name}.tar.gz" . + rm "${CACHE_ROOT}/${base_name}.tar.gz" + if [ -f "${CACHE_ROOT}/${base_name}.tar.gz.sha256" ]; then + echo "Using the local sha256 from ${CACHE_ROOT}/${base_name}.tar.gz.sha256" + package_sha256="$(< "${CACHE_ROOT}/${base_name}.tar.gz.sha256")" + rm "${CACHE_ROOT}/${base_name}.tar.gz.sha256" + fi + else + curl --remote-name --silent "${DOWNLOAD_URL}/${base_name}.tar.gz" + fi + if [ -n "$package_sha256" ]; then + echo "Verifying package integrity" + echo "$package_sha256 ${base_name}.tar.gz" | sha256sum --check - + fi + tar --directory /opt/bitnami --extract --gunzip --file "${base_name}.tar.gz" --no-same-owner --strip-components=2 "${base_name}/files/" + rm "${base_name}.tar.gz" +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libfile.sh b/bitnami/logstash/7/debian-10/prebuildfs/libfile.sh new file mode 100644 index 000000000000..12010f043e49 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libfile.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# +# Library for managing files + +# Functions + +######################## +# Ensure a line exists in the file by replacing a matching line. +# Arguments: +# $1 - filename +# $2 - line +# $3 - match +# Returns: +# None +######################### +file_contains_line() { + local filename="${1:?filename is required}" + local line="${2:?line is required}" + local match="${3:?match is required}" + + sed --in-place "s/^$match\$/$line/" "$filename" +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libfs.sh b/bitnami/logstash/7/debian-10/prebuildfs/libfs.sh new file mode 100644 index 000000000000..10a24735c096 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libfs.sh @@ -0,0 +1,129 @@ +#!/bin/bash +# +# Library for file system actions + +# Load Generic Libraries +. /liblog.sh + +# Functions + +######################## +# Ensure a file/directory is owned (user and group) but the given user +# Arguments: +# $1 - filepath +# $2 - owner +# Returns: +# None +######################### +owned_by() { + local path="${1:?path is missing}" + local owner="${2:?owner is missing}" + + chown "$owner":"$owner" "$path" +} + +######################## +# Ensure a directory exists and, optionally, is owned by the given user +# Arguments: +# $1 - directory +# $2 - owner +# Returns: +# None +######################### +ensure_dir_exists() { + local dir="${1:?directory is missing}" + local owner="${2:-}" + + mkdir -p "${dir}" + if [[ -n $owner ]]; then + owned_by "$dir" "$owner" + fi +} + +######################## +# Checks whether a directory is empty or not +# Arguments: +# $1 - directory +# Returns: +# Boolean +######################### +is_dir_empty() { + local dir="${1:?missing directory}" + + if [[ ! -e "$dir" ]] || [[ -z "$(ls -A "$dir")" ]]; then + true + else + false + fi +} + +######################## +# Configure permisions and ownership recursively +# Globals: +# None +# Arguments: +# $1 - paths (as a string). +# Flags: +# -f|--file-mode - mode for directories. +# -d|--dir-mode - mode for files. +# -u|--user - user +# -g|--group - group +# Returns: +# None +######################### +configure_permissions_ownership() { + local -r paths="${1:?paths is missing}" + local dir_mode="" + local file_mode="" + local user="" + local group="" + + # Validate arguments + shift 1 + while [ "$#" -gt 0 ]; do + case "$1" in + -f|--file-mode) + shift + file_mode="${1:?missing mode for files}" + ;; + -d|--dir-mode) + shift + dir_mode="${1:?missing mode for directories}" + ;; + -u|--user) + shift + user="${1:?missing user}" + ;; + -g|--group) + shift + group="${1:?missing group}" + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + + read -r -a filepaths <<< "$paths" + for p in "${filepaths[@]}"; do + if [[ -e "$p" ]]; then + if [[ -n $dir_mode ]]; then + find -L "$p" -type d -exec chmod "$dir_mode" {} \; + fi + if [[ -n $file_mode ]]; then + find -L "$p" -type f -exec chmod "$file_mode" {} \; + fi + if [[ -n $user ]] && [[ -n $group ]]; then + chown -LR "$user":"$group" "$p" + elif [[ -n $user ]] && [[ -z $group ]]; then + chown -LR "$user" "$p" + elif [[ -z $user ]] && [[ -n $group ]]; then + chgrp -LR "$group" "$p" + fi + else + stderr_print "$p does not exist" + fi + done +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/liblog.sh b/bitnami/logstash/7/debian-10/prebuildfs/liblog.sh new file mode 100644 index 000000000000..04118273394a --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/liblog.sh @@ -0,0 +1,83 @@ +#!/bin/bash +# +# Library for logging functions + +# Constants +RESET='\033[0m' +RED='\033[38;5;1m' +GREEN='\033[38;5;2m' +YELLOW='\033[38;5;3m' +MAGENTA='\033[38;5;5m' +CYAN='\033[38;5;6m' + +# Functions + +######################## +# Print to STDERR +# Arguments: +# Message to print +# Returns: +# None +######################### +stderr_print() { + printf "%b\\n" "${*}" >&2 +} + +######################## +# Log message +# Arguments: +# Message to log +# Returns: +# None +######################### +log() { + stderr_print "${CYAN}${MODULE:-} ${MAGENTA}$(date "+%T.%2N ")${RESET}${*}" +} +######################## +# Log an 'info' message +# Arguments: +# Message to log +# Returns: +# None +######################### +info() { + log "${GREEN}INFO ${RESET} ==> ${*}" +} +######################## +# Log message +# Arguments: +# Message to log +# Returns: +# None +######################### +warn() { + log "${YELLOW}WARN ${RESET} ==> ${*}" +} +######################## +# Log an 'error' message +# Arguments: +# Message to log +# Returns: +# None +######################### +error() { + log "${RED}ERROR${RESET} ==> ${*}" +} +######################## +# Log a 'debug' message +# Globals: +# BITNAMI_DEBUG +# Arguments: +# None +# Returns: +# None +######################### +debug() { + # 'is_boolean_yes' is defined in libvalidations.sh, but depends on this file so we cannot source it + local -r bool="${BITNAMI_DEBUG:-false}" + # comparison is performed without regard to the case of alphabetic characters + shopt -s nocasematch + if [[ "$bool" = 1 || "$bool" =~ ^(yes|true)$ ]]; then + log "${MAGENTA}DEBUG${RESET} ==> ${*}" + fi +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libnet.sh b/bitnami/logstash/7/debian-10/prebuildfs/libnet.sh new file mode 100644 index 000000000000..f884b7661fd7 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libnet.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# +# Library for network functions + +# Functions + +######################## +# Resolve dns +# Arguments: +# $1 - Hostname to resolve +# Returns: +# IP +######################### +dns_lookup() { + local host="${1:?host is missing}" + getent ahosts "$host" | awk '/STREAM/ {print $1 }' +} + +######################## +# Get machine's IP +# Arguments: +# None +# Returns: +# Machine IP +######################### +get_machine_ip() { + dns_lookup "$(hostname)" +} + +######################## +# Check if the provided argument is a resolved hostname +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_hostname_resolved() { + local -r host="${1:?missing value}" + if [[ -n "$(dns_lookup "$host")" ]]; then + true + else + false + fi +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libos.sh b/bitnami/logstash/7/debian-10/prebuildfs/libos.sh new file mode 100644 index 000000000000..1a5ba3bb2a64 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libos.sh @@ -0,0 +1,132 @@ +#!/bin/bash +# +# Library for operating system actions + +# Functions + +######################## +# Check if an user exists in the system +# Arguments: +# $1 - user +# Returns: +# Boolean +######################### +user_exists() { + local user="${1:?user is missing}" + id "$user" >/dev/null 2>&1 +} + +######################## +# Check if a group exists in the system +# Arguments: +# $1 - group +# Returns: +# Boolean +######################### +group_exists() { + local group="${1:?group is missing}" + getent group "$group" >/dev/null 2>&1 +} + +######################## +# Create a group in the system if it does not exist already +# Arguments: +# $1 - group +# Returns: +# None +######################### +ensure_group_exists() { + local group="${1:?group is missing}" + + if ! group_exists "$group"; then + groupadd "$group" >/dev/null 2>&1 + fi +} + +######################## +# Create an user in the system if it does not exist already +# Arguments: +# $1 - user +# $2 - group +# Returns: +# None +######################### +ensure_user_exists() { + local user="${1:?user is missing}" + local group="${2:-}" + + if ! user_exists "$user"; then + useradd "$user" >/dev/null 2>&1 + if [[ -n "$group" ]]; then + ensure_group_exists "$group" + usermod -a -G "$group" "$user" >/dev/null 2>&1 + fi + fi +} + +######################## +# Check if the script is currently running as root +# Arguments: +# $1 - user +# $2 - group +# Returns: +# Boolean +######################### +am_i_root() { + if [[ "$(id -u)" = "0" ]]; then + true + else + false + fi +} + +######################## +# Get total memory available +# Arguments: +# None +# Returns: +# Memory in bytes +######################### +get_total_memory() { + echo $(($(grep MemTotal /proc/meminfo | awk '{print $2}') / 1024)) +} + +######################### +# Redirects output to /dev/null if debug mode is disabled +# Globals: +# BITNAMI_DEBUG +# Arguments: +# $@ - Command to execute +# Returns: +# None +######################### +debug_execute() { + if ${BITNAMI_DEBUG:-false}; then + "$@" + else + "$@" >/dev/null 2>&1 + fi +} + +######################## +# Retries a command a given number of times +# Arguments: +# $1 - cmd (as a string) +# $2 - max retries. Default: 12 +# $3 - sleep between retries (in seconds). Default: 5 +# Returns: +# Boolean +######################### +retry_while() { + local -r cmd="${1:?cmd is missing}" + local -r retries="${2:-12}" + local -r sleep_time="${3:-5}" + local return_value=1 + + read -r -a command <<< "$cmd" + for ((i = 1 ; i <= retries ; i+=1 )); do + "${command[@]}" && return_value=0 && break + sleep "$sleep_time" + done + return $return_value +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libservice.sh b/bitnami/logstash/7/debian-10/prebuildfs/libservice.sh new file mode 100644 index 000000000000..0a83cd3d927f --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libservice.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# +# Library for managing services + +# Functions + +######################## +# Read the provided pid file and returns a PID +# Arguments: +# $1 - Pid file +# Returns: +# PID +######################### +get_pid_from_file() { + local pid_file="${1:?pid file is missing}" + + if [[ -f "$pid_file" ]]; then + if [[ -n "$(< "$pid_file")" ]] && [[ "$(< "$pid_file")" -gt 0 ]]; then + echo "$(< "$pid_file")" + fi + fi +} + +######################## +# Check if a provided PID corresponds to a running service +# Arguments: +# $1 - PID +# Returns: +# Boolean +######################### +is_service_running() { + local pid="${1:?pid is missing}" + + kill -0 "$pid" 2>/dev/null +} + +######################## +# Stop a service by sending a termination signal to its pid +# Arguments: +# $1 - Pid file +# Returns: +# None +######################### +stop_service_using_pid() { + local pid_file="${1:?pid file is missing}" + local pid + + pid="$(get_pid_from_file "$pid_file")" + [[ -z "$pid" ]] || ! is_service_running "$pid" && return + + kill "$pid" + local counter=10 + while [[ "$counter" -ne 0 ]] && is_service_running "$pid"; do + sleep 1 + counter=$((counter - 1)) + done +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libvalidations.sh b/bitnami/logstash/7/debian-10/prebuildfs/libvalidations.sh new file mode 100644 index 000000000000..ef9aaf0cf31f --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libvalidations.sh @@ -0,0 +1,246 @@ +#!/bin/bash +# +# Validation functions library + +# Load Generic Libraries +. /liblog.sh + +# Functions + +######################## +# Check if the provided argument is an integer +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_int() { + local -r int="${1:?missing value}" + if [[ "$int" =~ ^-?[0-9]+ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a positive integer +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_positive_int() { + local -r int="${1:?missing value}" + if is_int "$int" && (( "${int}" >= 0 )); then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean or is the string 'yes/true' +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_boolean_yes() { + local -r bool="${1:-}" + # comparison is performed without regard to the case of alphabetic characters + shopt -s nocasematch + if [[ "$bool" = 1 || "$bool" =~ ^(yes|true)$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean yes/no value +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_yes_no_value() { + local -r bool="${1:-}" + if [[ "$bool" =~ ^(yes|no)$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean true/false value +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_true_false_value() { + local -r bool="${1:-}" + if [[ "$bool" =~ ^(true|false)$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is an empty string or not defined +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_empty_value() { + local -r val="${1:-}" + if [[ -z "$val" ]]; then + true + else + false + fi +} + +######################## +# Validate if the provided argument is a valid port +# Arguments: +# $1 - Port to validate +# Returns: +# Boolean and error message +######################### +validate_port() { + local value + local unprivileged=0 + + # Parse flags + while [[ "$#" -gt 0 ]]; do + case "$1" in + -unprivileged) + unprivileged=1 + ;; + --) + shift + break + ;; + -*) + stderr_print "unrecognized flag $1" + return 1 + ;; + *) + break + ;; + esac + shift + done + + if [[ "$#" -gt 1 ]]; then + echo "too many arguments provided" + return 2 + elif [[ "$#" -eq 0 ]]; then + stderr_print "missing port argument" + return 1 + else + value=$1 + fi + + if [[ -z "$value" ]]; then + echo "the value is empty" + return 1 + else + if ! is_int "$value"; then + echo "value is not an integer" + return 2 + elif [[ "$value" -lt 0 ]]; then + echo "negative value provided" + return 2 + elif [[ "$value" -gt 65535 ]]; then + echo "requested port is greater than 65535" + return 2 + elif [[ "$unprivileged" = 1 && "$value" -lt 1024 ]]; then + echo "privileged port requested" + return 3 + fi + fi +} + +######################## +# Validate if the provided argument is a valid IPv4 address +# Arguments: +# $1 - IP to validate +# Returns: +# Boolean +######################### +validate_ipv4() { + local ip="${1:?ip is missing}" + local stat=1 + + if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + read -r -a ip_array <<< "$(tr '.' ' ' <<< "$ip")" + [[ ${ip_array[0]} -le 255 && ${ip_array[1]} -le 255 \ + && ${ip_array[2]} -le 255 && ${ip_array[3]} -le 255 ]] + stat=$? + fi + return $stat +} + +######################## +# Validate a string format +# Arguments: +# $1 - String to validate +# Returns: +# Boolean +######################### +validate_string() { + local string + local min_length=-1 + local max_length=-1 + + # Parse flags + while [ "$#" -gt 0 ]; do + case "$1" in + -min-length) + shift + min_length=${1:-} + ;; + -max-length) + shift + max_length=${1:-} + ;; + --) + shift + break + ;; + -*) + stderr_print "unrecognized flag $1" + return 1 + ;; + *) + break + ;; + esac + shift + done + + if [ "$#" -gt 1 ]; then + stderr_print "too many arguments provided" + return 2 + elif [ "$#" -eq 0 ]; then + stderr_print "missing string" + return 1 + else + string=$1 + fi + + if [[ "$min_length" -ge 0 ]] && [[ "${#string}" -lt "$min_length" ]]; then + echo "string length is less than $min_length" + return 1 + fi + if [[ "$max_length" -ge 0 ]] && [[ "${#string}" -gt "$max_length" ]]; then + echo "string length is great than $max_length" + return 1 + fi +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/libversion.sh b/bitnami/logstash/7/debian-10/prebuildfs/libversion.sh new file mode 100644 index 000000000000..b16090cfe1f4 --- /dev/null +++ b/bitnami/logstash/7/debian-10/prebuildfs/libversion.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# +# Library for managing versions strings + +# Load Generic Libraries +. ./liblog.sh + +# Functions +######################## +# Gets semantic version +# Arguments: +# $1 - version: string to extract major.minor.patch +# $2 - section: 1 to extract major, 2 to extract minor, 3 to extract patch +# Returns: +# array with the major, minor and release +######################### +get_sematic_version () { + local version="${1:?version is required}" + local section="${2:?section is required}" + local -a version_sections + + #Regex to parse versions: x.y.z + local -r regex='([0-9]+)(\.([0-9]+)(\.([0-9]+))?)?' + + if [[ "$version" =~ $regex ]]; then + local i=1 + local j=1 + local n=${#BASH_REMATCH[*]} + + while [[ $i -lt $n ]]; do + if [[ -n "${BASH_REMATCH[$i]}" ]] && [[ "${BASH_REMATCH[$i]:0:1}" != '.' ]]; then + version_sections[$j]=${BASH_REMATCH[$i]} + ((j++)) + fi + ((i++)) + done + + local number_regex='^[0-9]+$' + if [[ "$section" =~ $number_regex ]] && (( $section > 0 )) && (( $section <= 3 )); then + echo "${version_sections[$section]}" + return + else + stderr_print "Section allowed values are: 1, 2, and 3" + return 1 + fi + fi +} diff --git a/bitnami/logstash/7/debian-10/prebuildfs/opt/bitnami/.exists b/bitnami/logstash/7/debian-10/prebuildfs/opt/bitnami/.exists new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/bitnami/logstash/7/debian-10/rootfs/entrypoint.sh b/bitnami/logstash/7/debian-10/rootfs/entrypoint.sh new file mode 100755 index 000000000000..8c74d8d041a0 --- /dev/null +++ b/bitnami/logstash/7/debian-10/rootfs/entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +#set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /libbitnami.sh +. /liblog.sh +. /liblogstash.sh + +# Load Logstash environment variables +eval "$(logstash_env)" + +print_welcome_page + +if [[ "$*" = *"/run.sh"* ]]; then + info "** Starting Logstash setup **" + /setup.sh + info "** Logstash setup finished! **" +fi + +echo "" +exec "$@" diff --git a/bitnami/logstash/7/debian-10/rootfs/liblogstash.sh b/bitnami/logstash/7/debian-10/rootfs/liblogstash.sh new file mode 100644 index 000000000000..9084ee1cf846 --- /dev/null +++ b/bitnami/logstash/7/debian-10/rootfs/liblogstash.sh @@ -0,0 +1,143 @@ +#!/bin/bash +# +# Bitnami Logstash library + +# shellcheck disable=SC1090 +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /liblog.sh +. /libvalidations.sh +. /libos.sh +. /libfs.sh + +######################## +# Loads global variables used on LogstashLogstash configuration. +# Globals: +# Arguments: +# None +# Returns: +# Series of exports to be used as 'eval' arguments +######################### +logstash_env() { + cat <<"EOF" +# Bitnami debug +export MODULE=logstash +export BITNAMI_DEBUG="${BITNAMI_DEBUG:-false}" + +## Paths +export LOGSTASH_BASE_DIR="/opt/bitnami/logstash" +export LOGSTASH_VOLUME_DIR="${LOGSTASH_VOLUME_DIR:-/bitnami/logstash}" +export LOGSTASH_DATA_DIR="${LOGSTASH_BASE_DIR}/data" +export LOGSTASH_CONF_DIR="${LOGSTASH_BASE_DIR}/config" +export LOGSTASH_BIN_DIR="${LOGSTASH_BASE_DIR}/bin" +export LOGSTASH_LOG_DIR="${LOGSTASH_BASE_DIR}/logs" +export LOGSTASH_CONF_FILENAME="${LOGSTASH_CONF_FILENAME:-default_config.conf}" +export LOGSTASH_CONF_FILE="${LOGSTASH_CONF_DIR}/${LOGSTASH_CONF_FILENAME}" +export LOGSTASH_LOG_FILE="${LOGSTASH_LOG_DIR}/logstash-plain.log" +export LOGSTASH_MOUNTED_CONF_DIR="${LOGSTASH_VOLUME_DIR}/config" + +## Users +export LOGSTASH_DAEMON_USER="logstash" +export LOGSTASH_DAEMON_GROUP="logstash" + +## Exposed +export LOGSTASH_API_PORT_NUMBER="${LOGSTASH_API_PORT_NUMBER:-9600}" +export LOGSTASH_CONF_STRING="${LOGSTASH_CONF_STRING:-}" +export LOGSTASH_EXPOSE_API="${LOGSTASH_EXPOSE_API:-no}" +EOF +} + +######################## +# Ensure Logstash is initialized +# Globals: +# LOGSTASH_* +# Arguments: +# None +# Returns: +# None +######################### +logstash_create_dummy_config_file() { + info "Creating dummy config file" + cat > "$LOGSTASH_CONF_FILE" < 8080 } +} + +output { + stdout {} +} +EOF +} + +######################## +# Validate settings in Logstash environment variables +# Globals: +# DB_* +# Arguments: +# None +# Returns: +# None +######################### +logstash_validate() { + debug "Validating settings in LOGSTASH_* env vars..." + local error_code=0 + + # Auxiliary functions + print_validation_error() { + error "$1" + error_code=1 + } + + if ! err=$(validate_port "$LOGSTASH_API_PORT_NUMBER"); then + print_validation_error "An invalid port was specified in the environment variable LOGSTASH_API_PORT_NUMBER: $err" + fi + + if ! is_yes_no_value "$LOGSTASH_EXPOSE_API"; then + print_validation_error "The values allowed for LOGSTASH_EXPOSE_API are: yes or no" + fi + + [[ "$error_code" -eq 0 ]] || exit "$error_code" +} + +######################## +# Copy mounted configuration files +# Globals: +# LOGSTASH_* +# Arguments: +# None +# Returns: +# None +######################### +logstash_copy_mounted_config() { + if ! is_dir_empty "$LOGSTASH_MOUNTED_CONF_DIR"; then + info "Mounted config directory detected" + cp -Lr "$LOGSTASH_MOUNTED_CONF_DIR"/* "$LOGSTASH_CONF_DIR" + fi +} + +######################## +# Ensure Logstash is initialized +# Globals: +# LOGSTASH_* +# Arguments: +# None +# Returns: +# None +######################### +logstash_initialize() { + info "Initializing Logstash server..." + + am_i_root && chown -LR "$LOGSTASH_DAEMON_USER":"$LOGSTASH_DAEMON_GROUP" "$LOGSTASH_LOG_DIR" "$LOGSTASH_CONF_DIR" "$LOGSTASH_BIN_DIR" "$LOGSTASH_LIB_DIR" "$LOGSTASH_DATA_DIR" + + if [[ -z "$LOGSTASH_CONF_STRING" ]]; then + logstash_copy_mounted_config + + if [[ -e "$LOGSTASH_CONF_FILE" ]]; then + info "Config file detected." + else + info "Deploying Logstash with dummy config file..." + logstash_create_dummy_config_file + fi + fi +} diff --git a/bitnami/logstash/7/debian-10/rootfs/licenses/licenses.txt b/bitnami/logstash/7/debian-10/rootfs/licenses/licenses.txt new file mode 100644 index 000000000000..c76ba31f3b8a --- /dev/null +++ b/bitnami/logstash/7/debian-10/rootfs/licenses/licenses.txt @@ -0,0 +1,3 @@ +Bitnami containers ship with software bundles. You can find the licenses under: +/opt/bitnami/nami/COPYING +/opt/bitnami/[name-of-bundle]/licenses/[bundle-version].txt diff --git a/bitnami/logstash/7/debian-10/rootfs/postunpack.sh b/bitnami/logstash/7/debian-10/rootfs/postunpack.sh new file mode 100755 index 000000000000..47d992f528c7 --- /dev/null +++ b/bitnami/logstash/7/debian-10/rootfs/postunpack.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /libfs.sh +. /liblogstash.sh + +# Load Logstash environment variables +eval "$(logstash_env)" + +for dir in "$LOGSTASH_CONF_DIR" "$LOGSTASH_LOG_DIR" "$LOGSTASH_MOUNTED_CONF_DIR" "$LOGSTASH_VOLUME_DIR" "$LOGSTASH_DATA_DIR"; do + ensure_dir_exists "$dir" + chmod -R g+rwX "$dir" +done + diff --git a/bitnami/logstash/7/debian-10/rootfs/run.sh b/bitnami/logstash/7/debian-10/rootfs/run.sh new file mode 100755 index 000000000000..8ed69329b30f --- /dev/null +++ b/bitnami/logstash/7/debian-10/rootfs/run.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /liblog.sh +. /liblogstash.sh + +# Load Logstash environment variables +eval "$(logstash_env)" + +info "** Starting Logstash **" + +if [[ -n "$LOGSTASH_CONF_STRING" ]]; then + info "Starting logstash using config string" + args=( "-e" "$LOGSTASH_CONF_STRING" ) +else + info "Starting logstash using config file" + args=( "-f" "$LOGSTASH_CONF_FILE" ) +fi + +is_boolean_yes "$LOGSTASH_EXPOSE_API" && args+=( "--http.host" "0.0.0.0" "--http.port" "$LOGSTASH_API_PORT_NUMBER" ) + +if am_i_root; then + exec gosu "$LOGSTASH_DAEMON_USER" "${LOGSTASH_BIN_DIR}/logstash" "${args[@]}" +else + exec "${LOGSTASH_BIN_DIR}/logstash" "${args[@]}" +fi diff --git a/bitnami/logstash/7/debian-10/rootfs/setup.sh b/bitnami/logstash/7/debian-10/rootfs/setup.sh new file mode 100755 index 000000000000..aa1d965dff28 --- /dev/null +++ b/bitnami/logstash/7/debian-10/rootfs/setup.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /liblogstash.sh + +# Load Logstash environment variables +eval "$(logstash_env)" + +# Ensure Logstash environment variables are valid +logstash_validate + +# Ensure 'daemon' user exists when running as 'root' +am_i_root && ensure_user_exists "$LOGSTASH_DAEMON_USER" "$LOGSTASH_DAEMON_GROUP" + +# Ensure Logstash is initialized +logstash_initialize diff --git a/bitnami/logstash/README.md b/bitnami/logstash/README.md index 934aefd3ebe9..e066b0981f1f 100644 --- a/bitnami/logstash/README.md +++ b/bitnami/logstash/README.md @@ -39,13 +39,13 @@ Non-root container images add an extra layer of security and are generally recom # Supported tags and respective `Dockerfile` links -> NOTE: Debian 8 images have been deprecated in favor of Debian 9 images. Bitnami will not longer publish new Docker images based on Debian 8. +> NOTE: Debian 9 images have been deprecated in favor of Debian 10 images. Bitnami will not longer publish new Docker images based on Debian 9. Learn more about the Bitnami tagging policy and the difference between rolling tags and immutable tags [in our documentation page](https://docs.bitnami.com/containers/how-to/understand-rolling-tags-containers/). * [`7-ol-7`, `7.5.2-ol-7-r2` (7/ol-7/Dockerfile)](https://github.com/bitnami/bitnami-docker-logstash/blob/7.5.2-ol-7-r2/7/ol-7/Dockerfile) -* [`7-debian-9`, `7.5.2-debian-9-r1`, `7`, `7.5.2`, `7.5.2-r1`, `latest` (7/debian-9/Dockerfile)](https://github.com/bitnami/bitnami-docker-logstash/blob/7.5.2-debian-9-r1/7/debian-9/Dockerfile) +* [`7-debian-10`, `7.5.2-debian-10-r0`, `7`, `7.5.2`, `7.5.2-r0`, `latest` (7/debian-10/Dockerfile)](https://github.com/bitnami/bitnami-docker-logstash/blob/7.5.2-debian-10-r0/7/debian-10/Dockerfile) Subscribe to project updates by watching the [bitnami/logstash GitHub repo](https://github.com/bitnami/bitnami-docker-logstash). @@ -66,7 +66,7 @@ $ docker pull bitnami/logstash:[TAG] If you wish, you can also build the image yourself. ```bash -$ docker build -t bitnami/logstash:latest 'https://github.com/bitnami/bitnami-docker-logstash.git#master:7/debian-9' +$ docker build -t bitnami/logstash:latest 'https://github.com/bitnami/bitnami-docker-logstash.git#master:7/debian-10' ``` # Persisting your application