Updated docker entrypoint structure. Using libraries for common functions
This commit is contained in:
parent
901f9c348c
commit
932f81a92a
7
.github/workflows/images_build.yml
vendored
7
.github/workflows/images_build.yml
vendored
|
|
@ -493,7 +493,7 @@ jobs:
|
|||
tags: ${{ steps.meta.outputs.tags }}
|
||||
build_contexts: |
|
||||
sources=./sources/
|
||||
config_templates=./config_templates/
|
||||
config_templates=./templates/config/
|
||||
build_args: |
|
||||
BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }}
|
||||
labels: |
|
||||
|
|
@ -780,6 +780,8 @@ jobs:
|
|||
push: ${{ env.AUTO_PUSH_IMAGES }}
|
||||
sbom: ${{ env.AUTO_PUSH_IMAGES }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
build_contexts: |
|
||||
entrypoints=./templates/entrypoints/
|
||||
build_args: |
|
||||
BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }}
|
||||
labels: |
|
||||
|
|
@ -797,6 +799,9 @@ jobs:
|
|||
push: ${{ env.AUTO_PUSH_IMAGES }}
|
||||
sbom: ${{ env.AUTO_PUSH_IMAGES }}
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
build_contexts: |
|
||||
config_templates=./templates/config/snmptraps/
|
||||
scripts=./templates/scripts/snmptraps/
|
||||
labels: |
|
||||
org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||
org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
|
||||
|
|
|
|||
22
.github/workflows/images_build_rhel.yml
vendored
22
.github/workflows/images_build_rhel.yml
vendored
|
|
@ -578,6 +578,7 @@ jobs:
|
|||
|
||||
- name: Build image
|
||||
id: build_image
|
||||
if: ${{ matrix.build != 'snmptraps' }}
|
||||
uses: redhat-actions/buildah-build@v2.13
|
||||
with:
|
||||
context: ${{ format('{0}/{1}/rhel', env.DOCKERFILES_DIRECTORY, matrix.build) }}
|
||||
|
|
@ -590,8 +591,27 @@ jobs:
|
|||
${{ env.DOCKERFILES_DIRECTORY }}/${{ matrix.build }}/rhel/Dockerfile
|
||||
extra-args: |
|
||||
--iidfile=${{ github.workspace }}/iidfile
|
||||
--build-context entrypoints="./templates/entrypoints"
|
||||
build-args: |
|
||||
BUILD_BASE_IMAGE=${{ matrix.build != 'snmptraps' && format('localhost/{0}', steps.base_build.outputs.base_build_image) || '' }}
|
||||
BUILD_BASE_IMAGE=${{ steps.base_build.outputs.base_build_image }}
|
||||
|
||||
- name: Build snmptraps image
|
||||
id: build_image
|
||||
if: ${{ matrix.build == 'snmptraps' }}
|
||||
uses: redhat-actions/buildah-build@v2.13
|
||||
with:
|
||||
context: ${{ format('{0}/{1}/rhel', env.DOCKERFILES_DIRECTORY, matrix.build) }}
|
||||
layers: false
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: |
|
||||
org.opencontainers.image.revision=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||
org.opencontainers.image.created=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.created'] }}
|
||||
containerfiles: |
|
||||
${{ env.DOCKERFILES_DIRECTORY }}/${{ matrix.build }}/rhel/Dockerfile
|
||||
extra-args: |
|
||||
--iidfile=${{ github.workspace }}/iidfile
|
||||
--build-context config_templates="./templates/config/snmptraps"
|
||||
--build-context scripts="./templates/scripts/snmptraps"
|
||||
|
||||
- name: Validate registry secrets
|
||||
if: ${{ env.AUTO_PUSH_IMAGES == 'true' }}
|
||||
|
|
|
|||
|
|
@ -85,12 +85,16 @@ RUN set -eux && \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agentd -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,220 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
ZBX_SERVER_HOST=${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
ZBX_SERVER_PORT=${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
|
||||
prepare_zbx_agent_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agentd "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agentd' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -104,12 +104,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agentd -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,220 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
ZBX_SERVER_HOST=${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
ZBX_SERVER_PORT=${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
|
||||
prepare_zbx_agent_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agentd "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agentd' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -90,12 +90,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agentd -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,220 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
ZBX_SERVER_HOST=${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
ZBX_SERVER_PORT=${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
|
||||
prepare_zbx_agent_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agentd "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agentd' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -121,12 +121,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agentd -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,220 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
ZBX_SERVER_HOST=${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
ZBX_SERVER_PORT=${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
|
||||
prepare_zbx_agent_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agentd "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agentd' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -89,12 +89,16 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agentd -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,220 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
ZBX_SERVER_HOST=${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
ZBX_SERVER_PORT=${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agentd_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
|
||||
prepare_zbx_agent_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agentd "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agentd' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -84,12 +84,16 @@ RUN set -eux && \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agent2 -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent2.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp 31999/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,238 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
: ${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
: ${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
if [ "${ZBX_ENABLEPERSISTENTBUFFER,,}" == "true" ]; then
|
||||
export ZBX_ENABLEPERSISTENTBUFFER=1
|
||||
else
|
||||
unset ZBX_ENABLEPERSISTENTBUFFER
|
||||
unset ZBX_PERSISTENTBUFFERFILE
|
||||
fi
|
||||
|
||||
if [ "${ZBX_ENABLESTATUSPORT,,}" == "true" ]; then
|
||||
export ZBX_STATUSPORT=${ZBX_STATUSPORT="31999"}
|
||||
else
|
||||
unset ZBX_STATUSPORT
|
||||
fi
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_plugin_config() {
|
||||
echo "** Preparing Zabbix agent plugin configuration files"
|
||||
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mongodb.conf" "Plugins.MongoDB.System.Path" "/usr/sbin/zabbix-agent2-plugin/mongodb"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/postgresql.conf" "Plugins.PostgreSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/postgresql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mssql.conf" "Plugins.MSSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/mssql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/ember.conf" "Plugins.EmberPlus.System.Path" "/usr/sbin/zabbix-agent2-plugin/ember-plus"
|
||||
if command -v nvidia-smi 2>&1 >/dev/null
|
||||
then
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/nvidia.conf" "Plugins.NVIDIA.System.Path" "/usr/sbin/zabbix-agent2-plugin/nvidia-gpu"
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
prepare_zbx_agent_config
|
||||
prepare_zbx_agent_plugin_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agent2 "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agent2' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -105,12 +105,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agent2 -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent2.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp 31999/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,238 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
: ${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
: ${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
if [ "${ZBX_ENABLEPERSISTENTBUFFER,,}" == "true" ]; then
|
||||
export ZBX_ENABLEPERSISTENTBUFFER=1
|
||||
else
|
||||
unset ZBX_ENABLEPERSISTENTBUFFER
|
||||
unset ZBX_PERSISTENTBUFFERFILE
|
||||
fi
|
||||
|
||||
if [ "${ZBX_ENABLESTATUSPORT,,}" == "true" ]; then
|
||||
export ZBX_STATUSPORT=${ZBX_STATUSPORT="31999"}
|
||||
else
|
||||
unset ZBX_STATUSPORT
|
||||
fi
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_plugin_config() {
|
||||
echo "** Preparing Zabbix agent plugin configuration files"
|
||||
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mongodb.conf" "Plugins.MongoDB.System.Path" "/usr/sbin/zabbix-agent2-plugin/mongodb"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/postgresql.conf" "Plugins.PostgreSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/postgresql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mssql.conf" "Plugins.MSSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/mssql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/ember.conf" "Plugins.EmberPlus.System.Path" "/usr/sbin/zabbix-agent2-plugin/ember-plus"
|
||||
if command -v nvidia-smi 2>&1 >/dev/null
|
||||
then
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/nvidia.conf" "Plugins.NVIDIA.System.Path" "/usr/sbin/zabbix-agent2-plugin/nvidia-gpu"
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
prepare_zbx_agent_config
|
||||
prepare_zbx_agent_plugin_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agent2 "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agent2' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -92,12 +92,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agent2 -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent2.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp 31999/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,239 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
: ${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
: ${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local file_name=$3
|
||||
local var_value=$4
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
if [ "${ZBX_ENABLEPERSISTENTBUFFER,,}" == "true" ]; then
|
||||
export ZBX_ENABLEPERSISTENTBUFFER=1
|
||||
else
|
||||
unset ZBX_ENABLEPERSISTENTBUFFER
|
||||
unset ZBX_PERSISTENTBUFFERFILE
|
||||
fi
|
||||
|
||||
if [ "${ZBX_ENABLESTATUSPORT,,}" == "true" ]; then
|
||||
export ZBX_STATUSPORT=${ZBX_STATUSPORT="31999"}
|
||||
else
|
||||
unset ZBX_STATUSPORT
|
||||
fi
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_plugin_config() {
|
||||
echo "** Preparing Zabbix agent plugin configuration files"
|
||||
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mongodb.conf" "Plugins.MongoDB.System.Path" "/usr/sbin/zabbix-agent2-plugin/mongodb"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/postgresql.conf" "Plugins.PostgreSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/postgresql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mssql.conf" "Plugins.MSSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/mssql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/ember.conf" "Plugins.EmberPlus.System.Path" "/usr/sbin/zabbix-agent2-plugin/ember-plus"
|
||||
if command -v nvidia-smi 2>&1 >/dev/null
|
||||
then
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/nvidia.conf" "Plugins.NVIDIA.System.Path" "/usr/sbin/zabbix-agent2-plugin/nvidia-gpu"
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
prepare_zbx_agent_config
|
||||
prepare_zbx_agent_plugin_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agent2 "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agent2' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -117,12 +117,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agent2 -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent2.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp 31999/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,238 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
: ${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
: ${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
if [ "${ZBX_ENABLEPERSISTENTBUFFER,,}" == "true" ]; then
|
||||
export ZBX_ENABLEPERSISTENTBUFFER=1
|
||||
else
|
||||
unset ZBX_ENABLEPERSISTENTBUFFER
|
||||
unset ZBX_PERSISTENTBUFFERFILE
|
||||
fi
|
||||
|
||||
if [ "${ZBX_ENABLESTATUSPORT,,}" == "true" ]; then
|
||||
export ZBX_STATUSPORT=${ZBX_STATUSPORT="31999"}
|
||||
else
|
||||
unset ZBX_STATUSPORT
|
||||
fi
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_plugin_config() {
|
||||
echo "** Preparing Zabbix agent plugin configuration files"
|
||||
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mongodb.conf" "Plugins.MongoDB.System.Path" "/usr/sbin/zabbix-agent2-plugin/mongodb"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/postgresql.conf" "Plugins.PostgreSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/postgresql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mssql.conf" "Plugins.MSSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/mssql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/ember.conf" "Plugins.EmberPlus.System.Path" "/usr/sbin/zabbix-agent2-plugin/ember-plus"
|
||||
if command -v nvidia-smi 2>&1 >/dev/null
|
||||
then
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/nvidia.conf" "Plugins.NVIDIA.System.Path" "/usr/sbin/zabbix-agent2-plugin/nvidia-gpu"
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
prepare_zbx_agent_config
|
||||
prepare_zbx_agent_plugin_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agent2 "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agent2' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -91,12 +91,16 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_agent2 -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/agent2.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10050/tcp 31999/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,238 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Default Zabbix server host
|
||||
: ${ZBX_SERVER_HOST="zabbix-server"}
|
||||
# Default Zabbix server port number
|
||||
: ${ZBX_SERVER_PORT="10051"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
elif [ "$(grep -Ec "^[#;] $var_name=" $config_path)" -gt 0 ]; then
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
else
|
||||
sed -i -e '$a\' -e "$var_name=$var_value" "$config_path"
|
||||
echo "added at the end"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_config() {
|
||||
: ${ZBX_PASSIVESERVERS=""}
|
||||
: ${ZBX_ACTIVESERVERS=""}
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST","$ZBX_PASSIVESERVERS
|
||||
elif [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
ZBX_PASSIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
|
||||
if [ ! -z "$ZBX_SERVER_HOST" ]; then
|
||||
if [ ! -z "$ZBX_SERVER_PORT" ] && [ "$ZBX_SERVER_PORT" != "10051" ]; then
|
||||
ZBX_SERVER_HOST=$ZBX_SERVER_HOST":"$ZBX_SERVER_PORT
|
||||
fi
|
||||
if [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST","$ZBX_ACTIVESERVERS
|
||||
else
|
||||
ZBX_ACTIVESERVERS=$ZBX_SERVER_HOST
|
||||
fi
|
||||
fi
|
||||
|
||||
: ${ZBX_PASSIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_PASSIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_PASSIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_PASSIVESERVERS' servers for passive checks"
|
||||
export ZBX_PASSIVESERVERS="${ZBX_PASSIVESERVERS}"
|
||||
else
|
||||
unset ZBX_PASSIVESERVERS
|
||||
fi
|
||||
|
||||
: ${ZBX_ACTIVE_ALLOW:="true"}
|
||||
if [ "${ZBX_ACTIVE_ALLOW,,}" == "true" ] && [ ! -z "$ZBX_ACTIVESERVERS" ]; then
|
||||
echo "** Using '$ZBX_ACTIVESERVERS' servers for active checks"
|
||||
export ZBX_ACTIVESERVERS="${ZBX_ACTIVESERVERS}"
|
||||
else
|
||||
unset ZBX_ACTIVESERVERS
|
||||
fi
|
||||
unset ZBX_SERVER_HOST
|
||||
unset ZBX_SERVER_PORT
|
||||
|
||||
if [ "${ZBX_ENABLEPERSISTENTBUFFER,,}" == "true" ]; then
|
||||
export ZBX_ENABLEPERSISTENTBUFFER=1
|
||||
else
|
||||
unset ZBX_ENABLEPERSISTENTBUFFER
|
||||
unset ZBX_PERSISTENTBUFFERFILE
|
||||
fi
|
||||
|
||||
if [ "${ZBX_ENABLESTATUSPORT,,}" == "true" ]; then
|
||||
export ZBX_STATUSPORT=${ZBX_STATUSPORT="31999"}
|
||||
else
|
||||
unset ZBX_STATUSPORT
|
||||
fi
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "DenyKey" "${ZBX_DENYKEY}"
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_agent2_item_keys.conf" "AllowKey" "${ZBX_ALLOWKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
}
|
||||
|
||||
prepare_zbx_agent_plugin_config() {
|
||||
echo "** Preparing Zabbix agent plugin configuration files"
|
||||
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mongodb.conf" "Plugins.MongoDB.System.Path" "/usr/sbin/zabbix-agent2-plugin/mongodb"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/postgresql.conf" "Plugins.PostgreSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/postgresql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/mssql.conf" "Plugins.MSSQL.System.Path" "/usr/sbin/zabbix-agent2-plugin/mssql"
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/ember.conf" "Plugins.EmberPlus.System.Path" "/usr/sbin/zabbix-agent2-plugin/ember-plus"
|
||||
if command -v nvidia-smi 2>&1 >/dev/null
|
||||
then
|
||||
update_config_var "${ZABBIX_CONF_DIR}/zabbix_agent2.d/plugins.d/nvidia.conf" "Plugins.NVIDIA.System.Path" "/usr/sbin/zabbix-agent2-plugin/nvidia-gpu"
|
||||
fi
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_agent() {
|
||||
echo "** Preparing Zabbix agent"
|
||||
prepare_zbx_agent_config
|
||||
prepare_zbx_agent_plugin_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_agent2 "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_agent2' ]; then
|
||||
prepare_agent
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -32,7 +32,6 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY --from=builder /tmp/zabbix-${ZBX_VERSION}-output/java_gateway/sbin/ /usr/sbin/zabbix_java/
|
||||
COPY conf/usr/sbin/zabbix_java_gateway /usr/sbin/
|
||||
|
||||
RUN set -eux && \
|
||||
ARCH_SUFFIX="$(apk --print-arch)"; \
|
||||
|
|
@ -60,6 +59,7 @@ RUN set -eux && \
|
|||
--home ${ZABBIX_USER_HOME_DIR} \
|
||||
zabbix && \
|
||||
mkdir -p ${ZABBIX_CONF_DIR}/ \
|
||||
/usr/bin/entrypoint_lib/ \
|
||||
/usr/sbin/zabbix_java/ext_lib/ && \
|
||||
rm -rf /usr/sbin/zabbix_java/lib/logback.xml && \
|
||||
mv /usr/sbin/zabbix_java/lib/logback-console.xml ${ZABBIX_CONF_DIR}/zabbix_java_gateway_logback.xml && \
|
||||
|
|
@ -69,14 +69,16 @@ RUN set -eux && \
|
|||
chown --quiet -R zabbix:0 ${FIX_PERM_LIST} && \
|
||||
chmod -R g=u ${FIX_PERM_LIST}
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/java-gateway.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10052/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
||||
CMD ["/usr/sbin/zabbix_java_gateway"]
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
JAVA=${JAVA:-"/usr/bin/java"}
|
||||
|
||||
JAVA_OPTIONS="-server $JAVA_OPTIONS"
|
||||
JAVA_OPTIONS="$JAVA_OPTIONS -Dlogback.configurationFile=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml"
|
||||
|
||||
cd /usr/sbin/zabbix_java
|
||||
|
||||
CLASSPATH="lib"
|
||||
for jar in `find lib bin ext_lib -name "*.jar"`; do
|
||||
CLASSPATH="$CLASSPATH:$jar"
|
||||
done
|
||||
|
||||
if [ -n "$ZBX_LISTEN_IP" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenIP=$ZBX_LISTEN_IP"
|
||||
fi
|
||||
if [ -n "$ZBX_LISTEN_PORT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenPort=$ZBX_LISTEN_PORT"
|
||||
fi
|
||||
if [ -n "$ZBX_START_POLLERS" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.startPollers=$ZBX_START_POLLERS"
|
||||
fi
|
||||
if [ -n "$ZBX_TIMEOUT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.timeout=$ZBX_TIMEOUT"
|
||||
fi
|
||||
if [ -n "$ZBX_PROPERTIES_FILE" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.propertiesFile=$ZBX_PROPERTIES_FILE"
|
||||
fi
|
||||
|
||||
tcp_timeout=${ZBX_TIMEOUT:=3}000
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dsun.rmi.transport.tcp.responseTimeout=$tcp_timeout"
|
||||
|
||||
COMMAND_LINE="$JAVA $JAVA_OPTIONS -classpath $CLASSPATH $ZABBIX_OPTIONS com.zabbix.gateway.JavaGateway"
|
||||
|
||||
exec $COMMAND_LINE
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
prepare_java_gateway_config() {
|
||||
echo "** Preparing Zabbix Java Gateway log configuration file"
|
||||
|
||||
ZBX_GATEWAY_CONFIG=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml
|
||||
|
||||
: ${ZBX_DEBUGLEVEL:="info"}
|
||||
|
||||
echo "Updating $ZBX_GATEWAY_CONFIG 'DebugLevel' parameter: '${ZBX_DEBUGLEVEL}'... updated"
|
||||
sed -i -e "/^.*<root level=/s/=.*/=\"${ZBX_DEBUGLEVEL}\">/" "$ZBX_GATEWAY_CONFIG"
|
||||
}
|
||||
|
||||
prepare_java_gateway() {
|
||||
echo "** Preparing Zabbix Java Gateway"
|
||||
|
||||
prepare_java_gateway_config
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_java_gateway' ]; then
|
||||
prepare_java_gateway
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
|
||||
#################################################
|
||||
|
|
@ -31,7 +31,6 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY --from=builder /tmp/zabbix-${ZBX_VERSION}-output/java_gateway/sbin/ /usr/sbin/zabbix_java/
|
||||
COPY conf/usr/sbin/zabbix_java_gateway /usr/sbin/
|
||||
|
||||
RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
||||
--mount=type=tmpfs,target=/var/cache/yum/ \
|
||||
|
|
@ -71,14 +70,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chown --quiet -R zabbix:0 ${FIX_PERM_LIST} && \
|
||||
chmod -R g=u ${FIX_PERM_LIST}
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/java-gateway.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10052/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
||||
CMD ["/usr/sbin/zabbix_java_gateway"]
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
JAVA=${JAVA:-"/usr/bin/java"}
|
||||
|
||||
JAVA_OPTIONS="-server $JAVA_OPTIONS"
|
||||
JAVA_OPTIONS="$JAVA_OPTIONS -Dlogback.configurationFile=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml"
|
||||
|
||||
cd /usr/sbin/zabbix_java
|
||||
|
||||
CLASSPATH="lib"
|
||||
for jar in `find lib bin ext_lib -name "*.jar"`; do
|
||||
CLASSPATH="$CLASSPATH:$jar"
|
||||
done
|
||||
|
||||
if [ -n "$ZBX_LISTEN_IP" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenIP=$ZBX_LISTEN_IP"
|
||||
fi
|
||||
if [ -n "$ZBX_LISTEN_PORT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenPort=$ZBX_LISTEN_PORT"
|
||||
fi
|
||||
if [ -n "$ZBX_START_POLLERS" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.startPollers=$ZBX_START_POLLERS"
|
||||
fi
|
||||
if [ -n "$ZBX_TIMEOUT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.timeout=$ZBX_TIMEOUT"
|
||||
fi
|
||||
if [ -n "$ZBX_PROPERTIES_FILE" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.propertiesFile=$ZBX_PROPERTIES_FILE"
|
||||
fi
|
||||
|
||||
tcp_timeout=${ZBX_TIMEOUT:=3}000
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dsun.rmi.transport.tcp.responseTimeout=$tcp_timeout"
|
||||
|
||||
COMMAND_LINE="$JAVA $JAVA_OPTIONS -classpath $CLASSPATH $ZABBIX_OPTIONS com.zabbix.gateway.JavaGateway"
|
||||
|
||||
exec $COMMAND_LINE
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
prepare_java_gateway_config() {
|
||||
echo "** Preparing Zabbix Java Gateway log configuration file"
|
||||
|
||||
ZBX_GATEWAY_CONFIG=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml
|
||||
|
||||
: ${ZBX_DEBUGLEVEL:="info"}
|
||||
|
||||
echo "Updating $ZBX_GATEWAY_CONFIG 'DebugLevel' parameter: '${ZBX_DEBUGLEVEL}'... updated"
|
||||
sed -i -e "/^.*<root level=/s/=.*/=\"${ZBX_DEBUGLEVEL}\">/" "$ZBX_GATEWAY_CONFIG"
|
||||
}
|
||||
|
||||
prepare_java_gateway() {
|
||||
echo "** Preparing Zabbix Java Gateway"
|
||||
|
||||
prepare_java_gateway_config
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_java_gateway' ]; then
|
||||
prepare_java_gateway
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
|
||||
#################################################
|
||||
|
|
@ -31,7 +31,6 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY --from=builder /tmp/zabbix-${ZBX_VERSION}-output/java_gateway/sbin/ /usr/sbin/zabbix_java/
|
||||
COPY conf/usr/sbin/zabbix_java_gateway /usr/sbin/
|
||||
|
||||
RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
||||
--mount=type=tmpfs,target=/var/cache/yum/ \
|
||||
|
|
@ -70,14 +69,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chown --quiet -R zabbix:0 ${FIX_PERM_LIST} && \
|
||||
chmod -R g=u ${FIX_PERM_LIST}
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/java-gateway.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10052/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
||||
CMD ["/usr/sbin/zabbix_java_gateway"]
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
JAVA=${JAVA:-"/usr/bin/java"}
|
||||
|
||||
JAVA_OPTIONS="-server $JAVA_OPTIONS"
|
||||
JAVA_OPTIONS="$JAVA_OPTIONS -Dlogback.configurationFile=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml"
|
||||
|
||||
cd /usr/sbin/zabbix_java
|
||||
|
||||
CLASSPATH="lib"
|
||||
for jar in `find lib bin ext_lib -name "*.jar"`; do
|
||||
CLASSPATH="$CLASSPATH:$jar"
|
||||
done
|
||||
|
||||
if [ -n "$ZBX_LISTEN_IP" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenIP=$ZBX_LISTEN_IP"
|
||||
fi
|
||||
if [ -n "$ZBX_LISTEN_PORT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenPort=$ZBX_LISTEN_PORT"
|
||||
fi
|
||||
if [ -n "$ZBX_START_POLLERS" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.startPollers=$ZBX_START_POLLERS"
|
||||
fi
|
||||
if [ -n "$ZBX_TIMEOUT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.timeout=$ZBX_TIMEOUT"
|
||||
fi
|
||||
if [ -n "$ZBX_PROPERTIES_FILE" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.propertiesFile=$ZBX_PROPERTIES_FILE"
|
||||
fi
|
||||
|
||||
tcp_timeout=${ZBX_TIMEOUT:=3}000
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dsun.rmi.transport.tcp.responseTimeout=$tcp_timeout"
|
||||
|
||||
COMMAND_LINE="$JAVA $JAVA_OPTIONS -classpath $CLASSPATH $ZABBIX_OPTIONS com.zabbix.gateway.JavaGateway"
|
||||
|
||||
exec $COMMAND_LINE
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
prepare_java_gateway_config() {
|
||||
echo "** Preparing Zabbix Java Gateway log configuration file"
|
||||
|
||||
ZBX_GATEWAY_CONFIG=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml
|
||||
|
||||
: ${ZBX_DEBUGLEVEL:="info"}
|
||||
|
||||
echo "Updating $ZBX_GATEWAY_CONFIG 'DebugLevel' parameter: '${ZBX_DEBUGLEVEL}'... updated"
|
||||
sed -i -e "/^.*<root level=/s/=.*/=\"${ZBX_DEBUGLEVEL}\">/" "$ZBX_GATEWAY_CONFIG"
|
||||
}
|
||||
|
||||
prepare_java_gateway() {
|
||||
echo "** Preparing Zabbix Java Gateway"
|
||||
|
||||
prepare_java_gateway_config
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_java_gateway' ]; then
|
||||
prepare_java_gateway
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
|
||||
#################################################
|
||||
|
|
@ -50,7 +50,6 @@ STOPSIGNAL SIGTERM
|
|||
|
||||
COPY ["licenses", "/licenses"]
|
||||
COPY --from=builder /tmp/zabbix-${ZBX_VERSION}-output/java_gateway/sbin/ /usr/sbin/zabbix_java/
|
||||
COPY conf/usr/sbin/zabbix_java_gateway /usr/sbin/
|
||||
|
||||
RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
||||
--mount=type=tmpfs,target=/var/cache/yum/ \
|
||||
|
|
@ -91,14 +90,16 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chown --quiet -R zabbix:0 ${FIX_PERM_LIST} && \
|
||||
chmod -R g=u ${FIX_PERM_LIST}
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/java-gateway.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10052/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
||||
CMD ["/usr/sbin/zabbix_java_gateway"]
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
JAVA=${JAVA:-"/usr/bin/java"}
|
||||
|
||||
JAVA_OPTIONS="-server $JAVA_OPTIONS"
|
||||
JAVA_OPTIONS="$JAVA_OPTIONS -Dlogback.configurationFile=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml"
|
||||
|
||||
cd /usr/sbin/zabbix_java
|
||||
|
||||
CLASSPATH="lib"
|
||||
for jar in `find lib bin ext_lib -name "*.jar"`; do
|
||||
CLASSPATH="$CLASSPATH:$jar"
|
||||
done
|
||||
|
||||
if [ -n "$ZBX_LISTEN_IP" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenIP=$ZBX_LISTEN_IP"
|
||||
fi
|
||||
if [ -n "$ZBX_LISTEN_PORT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenPort=$ZBX_LISTEN_PORT"
|
||||
fi
|
||||
if [ -n "$ZBX_START_POLLERS" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.startPollers=$ZBX_START_POLLERS"
|
||||
fi
|
||||
if [ -n "$ZBX_TIMEOUT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.timeout=$ZBX_TIMEOUT"
|
||||
fi
|
||||
if [ -n "$ZBX_PROPERTIES_FILE" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.propertiesFile=$ZBX_PROPERTIES_FILE"
|
||||
fi
|
||||
|
||||
tcp_timeout=${ZBX_TIMEOUT:=3}000
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dsun.rmi.transport.tcp.responseTimeout=$tcp_timeout"
|
||||
|
||||
COMMAND_LINE="$JAVA $JAVA_OPTIONS -classpath $CLASSPATH $ZABBIX_OPTIONS com.zabbix.gateway.JavaGateway"
|
||||
|
||||
exec $COMMAND_LINE
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
prepare_java_gateway_config() {
|
||||
echo "** Preparing Zabbix Java Gateway log configuration file"
|
||||
|
||||
ZBX_GATEWAY_CONFIG=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml
|
||||
|
||||
: ${ZBX_DEBUGLEVEL:="info"}
|
||||
|
||||
echo "Updating $ZBX_GATEWAY_CONFIG 'DebugLevel' parameter: '${ZBX_DEBUGLEVEL}'... updated"
|
||||
sed -i -e "/^.*<root level=/s/=.*/=\"${ZBX_DEBUGLEVEL}\">/" "$ZBX_GATEWAY_CONFIG"
|
||||
}
|
||||
|
||||
prepare_java_gateway() {
|
||||
echo "** Preparing Zabbix Java Gateway"
|
||||
|
||||
prepare_java_gateway_config
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_java_gateway' ]; then
|
||||
prepare_java_gateway
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
|
||||
#################################################
|
||||
|
|
@ -31,7 +31,6 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY --from=builder /tmp/zabbix-${ZBX_VERSION}-output/java_gateway/sbin/ /usr/sbin/zabbix_java/
|
||||
COPY conf/usr/sbin/zabbix_java_gateway /usr/sbin/
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt/,sharing=locked \
|
||||
|
|
@ -68,14 +67,16 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
chown --quiet -R zabbix:0 ${FIX_PERM_LIST} && \
|
||||
chmod -R g=u ${FIX_PERM_LIST}
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/java-gateway.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10052/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
||||
CMD ["/usr/sbin/zabbix_java_gateway"]
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,35 +0,0 @@
|
|||
|
||||
JAVA=${JAVA:-"/usr/bin/java"}
|
||||
|
||||
JAVA_OPTIONS="-server $JAVA_OPTIONS"
|
||||
JAVA_OPTIONS="$JAVA_OPTIONS -Dlogback.configurationFile=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml"
|
||||
|
||||
cd /usr/sbin/zabbix_java
|
||||
|
||||
CLASSPATH="lib"
|
||||
for jar in `find lib bin ext_lib -name "*.jar"`; do
|
||||
CLASSPATH="$CLASSPATH:$jar"
|
||||
done
|
||||
|
||||
if [ -n "$ZBX_LISTEN_IP" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenIP=$ZBX_LISTEN_IP"
|
||||
fi
|
||||
if [ -n "$ZBX_LISTEN_PORT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.listenPort=$ZBX_LISTEN_PORT"
|
||||
fi
|
||||
if [ -n "$ZBX_START_POLLERS" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.startPollers=$ZBX_START_POLLERS"
|
||||
fi
|
||||
if [ -n "$ZBX_TIMEOUT" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.timeout=$ZBX_TIMEOUT"
|
||||
fi
|
||||
if [ -n "$ZBX_PROPERTIES_FILE" ]; then
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dzabbix.propertiesFile=$ZBX_PROPERTIES_FILE"
|
||||
fi
|
||||
|
||||
tcp_timeout=${ZBX_TIMEOUT:=3}000
|
||||
ZABBIX_OPTIONS="$ZABBIX_OPTIONS -Dsun.rmi.transport.tcp.responseTimeout=$tcp_timeout"
|
||||
|
||||
COMMAND_LINE="$JAVA $JAVA_OPTIONS -classpath $CLASSPATH $ZABBIX_OPTIONS com.zabbix.gateway.JavaGateway"
|
||||
|
||||
exec $COMMAND_LINE
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
prepare_java_gateway_config() {
|
||||
echo "** Preparing Zabbix Java Gateway log configuration file"
|
||||
|
||||
ZBX_GATEWAY_CONFIG=$ZABBIX_CONF_DIR/zabbix_java_gateway_logback.xml
|
||||
|
||||
: ${ZBX_DEBUGLEVEL:="info"}
|
||||
|
||||
echo "Updating $ZBX_GATEWAY_CONFIG 'DebugLevel' parameter: '${ZBX_DEBUGLEVEL}'... updated"
|
||||
sed -i -e "/^.*<root level=/s/=.*/=\"${ZBX_DEBUGLEVEL}\">/" "$ZBX_GATEWAY_CONFIG"
|
||||
}
|
||||
|
||||
prepare_java_gateway() {
|
||||
echo "** Preparing Zabbix Java Gateway"
|
||||
|
||||
prepare_java_gateway_config
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_java_gateway' ]; then
|
||||
prepare_java_gateway
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
|
||||
#################################################
|
||||
|
|
@ -21,7 +21,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mariadb \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/sbin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
@ -115,14 +116,18 @@ RUN set -eux && \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,440 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
DB_SERVER_ROOT_USER=${DB_SERVER_ROOT_USER:-${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix_proxy"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
result="--ssl"
|
||||
|
||||
if [ "${ZBX_DBTLSCONNECT}" != "required" ]; then
|
||||
result="${result} --ssl-verify-server-cert"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mariadb-admin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --skip-ssl-verify-server-cert --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mariadb --silent --skip-column-names --skip-ssl-verify-server-cert $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mariadb --silent --skip-column-names --skip-ssl-verify-server-cert \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-proxy-mysql/create.sql.gz"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ -z "${ZBX_HOSTNAME}" ] && [ -n "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-mysql"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "** Preparing Zabbix proxy"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -20,7 +20,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mysql \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/sbin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
@ -136,14 +137,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,437 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
DB_SERVER_ROOT_USER=${DB_SERVER_ROOT_USER:-${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix_proxy"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
ssl_mode=${ZBX_DBTLSCONNECT//verify_full/verify_identity}
|
||||
result="--ssl-mode=$ssl_mode"
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mysqladmin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mysql --silent --skip-column-names $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mysql --silent --skip-column-names \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-proxy-mysql/create.sql.gz"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ -z "${ZBX_HOSTNAME}" ] && [ -n "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-mysql"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "** Preparing Zabbix proxy"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -20,7 +20,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mysql \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/sbin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
@ -122,14 +123,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,437 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
DB_SERVER_ROOT_USER=${DB_SERVER_ROOT_USER:-${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix_proxy"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
ssl_mode=${ZBX_DBTLSCONNECT//verify_full/verify_identity}
|
||||
result="--ssl-mode=$ssl_mode"
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mysqladmin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mysql --silent --skip-column-names $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mysql --silent --skip-column-names \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-proxy-mysql/create.sql.gz"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ -z "${ZBX_HOSTNAME}" ] && [ -n "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-mysql"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "** Preparing Zabbix proxy"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -21,7 +21,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mysql \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/sbin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
@ -152,14 +153,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,437 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
DB_SERVER_ROOT_USER=${DB_SERVER_ROOT_USER:-${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix_proxy"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
ssl_mode=${ZBX_DBTLSCONNECT//verify_full/verify_identity}
|
||||
result="--ssl-mode=$ssl_mode"
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mysqladmin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mysql --silent --skip-column-names $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mysql --silent --skip-column-names \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-proxy-mysql/create.sql.gz"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ -z "${ZBX_HOSTNAME}" ] && [ -n "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-mysql"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "** Preparing Zabbix proxy"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -20,7 +20,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mysql \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/bin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
|
|||
|
|
@ -110,14 +110,18 @@ RUN set -eux && \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-sqlite3.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,195 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
: ${ZBX_USE_NODE_NAME_AS_DB_NAME:="false"}
|
||||
if [ "${ZBX_USE_NODE_NAME_AS_DB_NAME,,}" == "false" ]; then
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}.sqlite"
|
||||
else
|
||||
node_name=$(uname -n)
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/$node_name.sqlite"
|
||||
fi
|
||||
unset ZBX_USE_NODE_NAME_AS_DB_NAME
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ ! -z "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "Preparing Zabbix proxy"
|
||||
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -130,14 +130,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-sqlite3.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,195 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
: ${ZBX_USE_NODE_NAME_AS_DB_NAME:="false"}
|
||||
if [ "${ZBX_USE_NODE_NAME_AS_DB_NAME,,}" == "false" ]; then
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}.sqlite"
|
||||
else
|
||||
node_name=$(uname -n)
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/$node_name.sqlite"
|
||||
fi
|
||||
unset ZBX_USE_NODE_NAME_AS_DB_NAME
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ ! -z "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "Preparing Zabbix proxy"
|
||||
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -115,14 +115,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-sqlite3.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,195 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
: ${ZBX_USE_NODE_NAME_AS_DB_NAME:="false"}
|
||||
if [ "${ZBX_USE_NODE_NAME_AS_DB_NAME,,}" == "false" ]; then
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}.sqlite"
|
||||
else
|
||||
node_name=$(uname -n)
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/$node_name.sqlite"
|
||||
fi
|
||||
unset ZBX_USE_NODE_NAME_AS_DB_NAME
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ ! -z "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "Preparing Zabbix proxy"
|
||||
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -148,14 +148,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-sqlite3.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,195 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
: ${ZBX_USE_NODE_NAME_AS_DB_NAME:="false"}
|
||||
if [ "${ZBX_USE_NODE_NAME_AS_DB_NAME,,}" == "false" ]; then
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}.sqlite"
|
||||
else
|
||||
node_name=$(uname -n)
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/$node_name.sqlite"
|
||||
fi
|
||||
unset ZBX_USE_NODE_NAME_AS_DB_NAME
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ ! -z "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "Preparing Zabbix proxy"
|
||||
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -117,14 +117,18 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_proxy -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/proxy-sqlite3.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,195 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
: ${ZBX_USE_NODE_NAME_AS_DB_NAME:="false"}
|
||||
if [ "${ZBX_USE_NODE_NAME_AS_DB_NAME,,}" == "false" ]; then
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}.sqlite"
|
||||
else
|
||||
node_name=$(uname -n)
|
||||
export ZBX_DB_NAME="${ZABBIX_USER_HOME_DIR}/db_data/$node_name.sqlite"
|
||||
fi
|
||||
unset ZBX_USE_NODE_NAME_AS_DB_NAME
|
||||
|
||||
export ZBX_SERVER_HOST="${ZBX_SERVER_HOST:="zabbix-server"}"
|
||||
|
||||
if [ ! -z "${ZBX_HOSTNAMEITEM}" ]; then
|
||||
export ZBX_HOSTNAME=""
|
||||
else
|
||||
export ZBX_HOSTNAME="${ZBX_HOSTNAME:-"zabbix-proxy-sqlite3"}"
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_proxy_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
file_process_from_env "ZBX_TLSPSKFILE" "${ZBX_TLSPSKFILE}" "${ZBX_TLSPSK}"
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^ZABBIX_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_proxy() {
|
||||
echo "Preparing Zabbix proxy"
|
||||
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_proxy "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_proxy' ]; then
|
||||
prepare_proxy
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
|
||||
#################################################
|
||||
|
|
@ -21,7 +21,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mariadb \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/sbin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
@ -119,14 +120,18 @@ RUN set -eux && \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,456 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
: ${DB_SERVER_ROOT_USER:=${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
result="--ssl"
|
||||
|
||||
if [ "${ZBX_DBTLSCONNECT}" != "required" ]; then
|
||||
result="${result} --ssl-verify-server-cert"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mariadb-admin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --skip-ssl-verify-server-cert --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mariadb --silent --skip-column-names --skip-ssl-verify-server-cert $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mariadb --silent --skip-column-names --skip-ssl-verify-server-cert \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-mysql/create.sql.gz"
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -20,7 +20,8 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_CONF_DIR=/etc/zabbix
|
||||
|
||||
ENV ZBX_DB_NAME=dummy_db_name \
|
||||
ENV DB_ENGINE=mysql \
|
||||
ZBX_DB_NAME=dummy_db_name \
|
||||
ZBX_FPINGLOCATION=/usr/sbin/fping \
|
||||
ZBX_LOADMODULEPATH=${ZABBIX_USER_HOME_DIR}/modules \
|
||||
ZBX_SNMPTRAPPERFILE=${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log \
|
||||
|
|
@ -144,14 +145,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,453 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
: ${DB_SERVER_ROOT_USER:=${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
ssl_mode=${ZBX_DBTLSCONNECT//verify_full/verify_identity}
|
||||
result="--ssl-mode=$ssl_mode"
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mysqladmin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mysql --silent --skip-column-names $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mysql --silent --skip-column-names \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-mysql/create.sql.gz"
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -127,14 +127,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,453 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
: ${DB_SERVER_ROOT_USER:=${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
ssl_mode=${ZBX_DBTLSCONNECT//verify_full/verify_identity}
|
||||
result="--ssl-mode=$ssl_mode"
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mysqladmin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mysql --silent --skip-column-names $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mysql --silent --skip-column-names \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-mysql/create.sql.gz"
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -161,14 +161,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -125,14 +125,18 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,453 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
: ${DB_CHARACTER_SET:="utf8mb4"}
|
||||
: ${DB_CHARACTER_COLLATE:="utf8mb4_bin"}
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables_mysql() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
USE_DB_ROOT_USER=false
|
||||
CREATE_ZBX_DB_USER=false
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
file_env MYSQL_ROOT_USER
|
||||
file_env MYSQL_ROOT_PASSWORD
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ "${MYSQL_RANDOM_ROOT_PASSWORD,,}" == "true" ]; then
|
||||
echo "**** Impossible to use MySQL server because of unknown Zabbix user and random 'root' password"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -n "${MYSQL_USER}" ] && [ ! -n "${MYSQL_ROOT_PASSWORD}" ] && [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" != "true" ]; then
|
||||
echo "*** Impossible to use MySQL server because 'root' password is not defined and it is not empty"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || [ -n "${MYSQL_ROOT_PASSWORD}" ]; then
|
||||
USE_DB_ROOT_USER=true
|
||||
DB_SERVER_ROOT_USER=${MYSQL_ROOT_USER:-"root"}
|
||||
DB_SERVER_ROOT_PASS=${MYSQL_ROOT_PASSWORD:-""}
|
||||
fi
|
||||
|
||||
[ -n "${MYSQL_USER}" ] && [ "${USE_DB_ROOT_USER}" == "true" ] && CREATE_ZBX_DB_USER=true
|
||||
|
||||
# If root password is not specified use provided credentials
|
||||
: ${DB_SERVER_ROOT_USER:=${MYSQL_USER}}
|
||||
[ "${MYSQL_ALLOW_EMPTY_PASSWORD,,}" == "true" ] || DB_SERVER_ROOT_PASS=${DB_SERVER_ROOT_PASS:-${MYSQL_PASSWORD}}
|
||||
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
ssl_mode=${ZBX_DBTLSCONNECT//verify_full/verify_identity}
|
||||
result="--ssl-mode=$ssl_mode"
|
||||
|
||||
if [ -n "${ZBX_DBTLSCAFILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DBTLSCAFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSKEYFILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DBTLSKEYFILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCERTFILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DBTLSCERTFILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
check_db_connect_mysql() {
|
||||
echo "********************"
|
||||
if [ ! -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
if [ "${USE_DB_ROOT_USER}" == "true" ]; then
|
||||
echo "* DB_SERVER_ROOT_USER: ${DB_SERVER_ROOT_USER}"
|
||||
echo "* DB_SERVER_ROOT_PASS: ${DB_SERVER_ROOT_PASS}"
|
||||
fi
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
while [ ! "$(mysqladmin ping $mysql_connect_args -u ${DB_SERVER_ROOT_USER} \
|
||||
--silent --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
mysql_query() {
|
||||
query=$1
|
||||
local result=""
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
result=$(mysql --silent --skip-column-names $mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} -e "$query" $ssl_opts)
|
||||
|
||||
unset MYSQL_PWD
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ROOT_PASS}"
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command "$sql_script" | mysql --silent --skip-column-names \
|
||||
--default-character-set=${DB_CHARACTER_SET} \
|
||||
$mysql_connect_args \
|
||||
-u ${DB_SERVER_ROOT_USER} $ssl_opts \
|
||||
${DB_SERVER_DBNAME} 1>/dev/null
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
create_db_user_mysql() {
|
||||
[ "${CREATE_ZBX_DB_USER}" == "true" ] || return
|
||||
|
||||
echo "** Creating '${DB_SERVER_ZBX_USER}' user in MySQL database"
|
||||
|
||||
USER_EXISTS=$(mysql_query "SELECT 1 FROM mysql.user WHERE user = '${DB_SERVER_ZBX_USER}' AND host = '%'")
|
||||
|
||||
if [ -z "$USER_EXISTS" ]; then
|
||||
mysql_query "CREATE USER '${DB_SERVER_ZBX_USER}'@'%' IDENTIFIED BY '${DB_SERVER_ZBX_PASS}'" 1>/dev/null
|
||||
else
|
||||
mysql_query "ALTER USER ${DB_SERVER_ZBX_USER} IDENTIFIED BY '${DB_SERVER_ZBX_PASS}';" 1>/dev/null
|
||||
fi
|
||||
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
}
|
||||
|
||||
create_db_database_mysql() {
|
||||
DB_EXISTS=$(mysql_query "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='${DB_SERVER_DBNAME}'")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
mysql_query "CREATE DATABASE ${DB_SERVER_DBNAME} CHARACTER SET ${DB_CHARACTER_SET} COLLATE ${DB_CHARACTER_COLLATE}" 1>/dev/null
|
||||
# better solution?
|
||||
mysql_query "GRANT ALL PRIVILEGES ON $DB_SERVER_DBNAME. * TO '${DB_SERVER_ZBX_USER}'@'%'" 1>/dev/null
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database COLLATE!"
|
||||
fi
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_mysql() {
|
||||
DBVERSION_TABLE_EXISTS=$(mysql_query "SELECT 1 FROM information_schema.tables WHERE table_schema='${DB_SERVER_DBNAME}' and table_name = 'dbversion'")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(mysql_query "SELECT mandatory FROM ${DB_SERVER_DBNAME}.dbversion")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in MySQL"
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-mysql/create.sql.gz"
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
test -z "${DB_SERVER_SOCKET}" || export ZBX_DB_SOCKET="${DB_SERVER_SOCKET}"
|
||||
test -z "${DB_SERVER_HOST}" || export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
test -z "${DB_SERVER_PORT}" || export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|MYSQL)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_mysql
|
||||
check_db_connect_mysql
|
||||
create_db_user_mysql
|
||||
create_db_database_mysql
|
||||
create_db_schema_mysql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -117,14 +117,18 @@ RUN set -eux && \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-pgsql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,484 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
#Enable PostgreSQL timescaleDB feature:
|
||||
: ${ENABLE_TIMESCALEDB:="false"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for PostgreSQL database
|
||||
check_variables_postgresql() {
|
||||
: ${DB_SERVER_HOST="postgres-server"}
|
||||
: ${DB_SERVER_PORT:="5432"}
|
||||
|
||||
file_env POSTGRES_USER
|
||||
file_env POSTGRES_PASSWORD
|
||||
|
||||
DB_SERVER_ROOT_USER=${POSTGRES_USER:-"postgres"}
|
||||
DB_SERVER_ROOT_PASS=${POSTGRES_PASSWORD:-""}
|
||||
|
||||
DB_SERVER_ZBX_USER=${POSTGRES_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${POSTGRES_PASSWORD:-"zabbix"}
|
||||
|
||||
: ${DB_SERVER_SCHEMA:="public"}
|
||||
|
||||
DB_SERVER_DBNAME=${POSTGRES_DB:-"zabbix"}
|
||||
|
||||
: ${POSTGRES_USE_IMPLICIT_SEARCH_PATH:="false"}
|
||||
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
psql_connect_args="--host ${DB_SERVER_HOST} --port ${DB_SERVER_PORT}"
|
||||
else
|
||||
psql_connect_args="--port ${DB_SERVER_PORT}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_db_connect_postgresql() {
|
||||
echo "********************"
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_HOST: Using DB socket"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
echo "* DB_SERVER_SCHEMA: ${DB_SERVER_SCHEMA}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
while true :
|
||||
do
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --quiet 1>/dev/null 2>&1 && break
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --dbname ${DB_SERVER_DBNAME} --quiet 1>/dev/null 2>&1 && break
|
||||
|
||||
echo "**** PostgreSQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
psql_query() {
|
||||
query=$1
|
||||
db=$2
|
||||
|
||||
local result=""
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
result=$(psql --no-align --quiet --tuples-only $psql_connect_args \
|
||||
--username "${DB_SERVER_ROOT_USER}" --command "$query" --dbname "$db" 2>/dev/null);
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command $sql_script | psql --quiet \
|
||||
$psql_connect_args \
|
||||
--username "${DB_SERVER_ZBX_USER}" --dbname "${DB_SERVER_DBNAME}" 1>/dev/null || exit 1
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
create_db_database_postgresql() {
|
||||
DB_EXISTS=$(psql_query "SELECT 1 AS result FROM pg_database WHERE datname='${DB_SERVER_DBNAME}'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
createdb $psql_connect_args --username "${DB_SERVER_ROOT_USER}" \
|
||||
--owner "${DB_SERVER_ZBX_USER}" --lc-ctype "en_US.utf8" --lc-collate "en_US.utf8" "${DB_SERVER_DBNAME}"
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database owner!"
|
||||
fi
|
||||
|
||||
psql_query "CREATE SCHEMA IF NOT EXISTS ${DB_SERVER_SCHEMA}" "${DB_SERVER_DBNAME}" 1>/dev/null
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_postgresql() {
|
||||
DBVERSION_TABLE_EXISTS=$(psql_query "SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid =
|
||||
c.relnamespace WHERE n.nspname = '$DB_SERVER_SCHEMA' AND c.relname = 'dbversion'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(psql_query "SELECT mandatory FROM ${DB_SERVER_SCHEMA}.dbversion" "${DB_SERVER_DBNAME}")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in PostgreSQL"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
psql_query "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" "${DB_SERVER_DBNAME}"
|
||||
fi
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/create.sql.gz"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/timescaledb.sql"
|
||||
fi
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
export ZBX_DB_SCHEMA="${DB_SERVER_SCHEMA}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|POSTGRES)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_postgresql
|
||||
check_db_connect_postgresql
|
||||
create_db_database_postgresql
|
||||
create_db_schema_postgresql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -143,14 +143,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-pgsql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,484 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
#Enable PostgreSQL timescaleDB feature:
|
||||
: ${ENABLE_TIMESCALEDB:="false"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for PostgreSQL database
|
||||
check_variables_postgresql() {
|
||||
: ${DB_SERVER_HOST="postgres-server"}
|
||||
: ${DB_SERVER_PORT:="5432"}
|
||||
|
||||
file_env POSTGRES_USER
|
||||
file_env POSTGRES_PASSWORD
|
||||
|
||||
DB_SERVER_ROOT_USER=${POSTGRES_USER:-"postgres"}
|
||||
DB_SERVER_ROOT_PASS=${POSTGRES_PASSWORD:-""}
|
||||
|
||||
DB_SERVER_ZBX_USER=${POSTGRES_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${POSTGRES_PASSWORD:-"zabbix"}
|
||||
|
||||
: ${DB_SERVER_SCHEMA:="public"}
|
||||
|
||||
DB_SERVER_DBNAME=${POSTGRES_DB:-"zabbix"}
|
||||
|
||||
: ${POSTGRES_USE_IMPLICIT_SEARCH_PATH:="false"}
|
||||
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
psql_connect_args="--host ${DB_SERVER_HOST} --port ${DB_SERVER_PORT}"
|
||||
else
|
||||
psql_connect_args="--port ${DB_SERVER_PORT}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_db_connect_postgresql() {
|
||||
echo "********************"
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_HOST: Using DB socket"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
echo "* DB_SERVER_SCHEMA: ${DB_SERVER_SCHEMA}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
while true :
|
||||
do
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --quiet 1>/dev/null 2>&1 && break
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --dbname ${DB_SERVER_DBNAME} --quiet 1>/dev/null 2>&1 && break
|
||||
|
||||
echo "**** PostgreSQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
psql_query() {
|
||||
query=$1
|
||||
db=$2
|
||||
|
||||
local result=""
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
result=$(psql --no-align --quiet --tuples-only $psql_connect_args \
|
||||
--username "${DB_SERVER_ROOT_USER}" --command "$query" --dbname "$db" 2>/dev/null);
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command $sql_script | psql --quiet \
|
||||
$psql_connect_args \
|
||||
--username "${DB_SERVER_ZBX_USER}" --dbname "${DB_SERVER_DBNAME}" 1>/dev/null || exit 1
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
create_db_database_postgresql() {
|
||||
DB_EXISTS=$(psql_query "SELECT 1 AS result FROM pg_database WHERE datname='${DB_SERVER_DBNAME}'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
createdb $psql_connect_args --username "${DB_SERVER_ROOT_USER}" \
|
||||
--owner "${DB_SERVER_ZBX_USER}" --lc-ctype "en_US.utf8" --lc-collate "en_US.utf8" "${DB_SERVER_DBNAME}"
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database owner!"
|
||||
fi
|
||||
|
||||
psql_query "CREATE SCHEMA IF NOT EXISTS ${DB_SERVER_SCHEMA}" "${DB_SERVER_DBNAME}" 1>/dev/null
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_postgresql() {
|
||||
DBVERSION_TABLE_EXISTS=$(psql_query "SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid =
|
||||
c.relnamespace WHERE n.nspname = '$DB_SERVER_SCHEMA' AND c.relname = 'dbversion'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(psql_query "SELECT mandatory FROM ${DB_SERVER_SCHEMA}.dbversion" "${DB_SERVER_DBNAME}")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in PostgreSQL"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
psql_query "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" "${DB_SERVER_DBNAME}"
|
||||
fi
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/create.sql.gz"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/timescaledb.sql"
|
||||
fi
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
export ZBX_DB_SCHEMA="${DB_SERVER_SCHEMA}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|POSTGRES)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_postgresql
|
||||
check_db_connect_postgresql
|
||||
create_db_database_postgresql
|
||||
create_db_schema_postgresql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -125,14 +125,18 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-pgsql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,484 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
#Enable PostgreSQL timescaleDB feature:
|
||||
: ${ENABLE_TIMESCALEDB:="false"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for PostgreSQL database
|
||||
check_variables_postgresql() {
|
||||
: ${DB_SERVER_HOST="postgres-server"}
|
||||
: ${DB_SERVER_PORT:="5432"}
|
||||
|
||||
file_env POSTGRES_USER
|
||||
file_env POSTGRES_PASSWORD
|
||||
|
||||
DB_SERVER_ROOT_USER=${POSTGRES_USER:-"postgres"}
|
||||
DB_SERVER_ROOT_PASS=${POSTGRES_PASSWORD:-""}
|
||||
|
||||
DB_SERVER_ZBX_USER=${POSTGRES_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${POSTGRES_PASSWORD:-"zabbix"}
|
||||
|
||||
: ${DB_SERVER_SCHEMA:="public"}
|
||||
|
||||
DB_SERVER_DBNAME=${POSTGRES_DB:-"zabbix"}
|
||||
|
||||
: ${POSTGRES_USE_IMPLICIT_SEARCH_PATH:="false"}
|
||||
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
psql_connect_args="--host ${DB_SERVER_HOST} --port ${DB_SERVER_PORT}"
|
||||
else
|
||||
psql_connect_args="--port ${DB_SERVER_PORT}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_db_connect_postgresql() {
|
||||
echo "********************"
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_HOST: Using DB socket"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
echo "* DB_SERVER_SCHEMA: ${DB_SERVER_SCHEMA}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
while true :
|
||||
do
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --quiet 1>/dev/null 2>&1 && break
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --dbname ${DB_SERVER_DBNAME} --quiet 1>/dev/null 2>&1 && break
|
||||
|
||||
echo "**** PostgreSQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
psql_query() {
|
||||
query=$1
|
||||
db=$2
|
||||
|
||||
local result=""
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
result=$(psql --no-align --quiet --tuples-only $psql_connect_args \
|
||||
--username "${DB_SERVER_ROOT_USER}" --command "$query" --dbname "$db" 2>/dev/null);
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command $sql_script | psql --quiet \
|
||||
$psql_connect_args \
|
||||
--username "${DB_SERVER_ZBX_USER}" --dbname "${DB_SERVER_DBNAME}" 1>/dev/null || exit 1
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
create_db_database_postgresql() {
|
||||
DB_EXISTS=$(psql_query "SELECT 1 AS result FROM pg_database WHERE datname='${DB_SERVER_DBNAME}'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
createdb $psql_connect_args --username "${DB_SERVER_ROOT_USER}" \
|
||||
--owner "${DB_SERVER_ZBX_USER}" --lc-ctype "en_US.utf8" --lc-collate "en_US.utf8" "${DB_SERVER_DBNAME}"
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database owner!"
|
||||
fi
|
||||
|
||||
psql_query "CREATE SCHEMA IF NOT EXISTS ${DB_SERVER_SCHEMA}" "${DB_SERVER_DBNAME}" 1>/dev/null
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_postgresql() {
|
||||
DBVERSION_TABLE_EXISTS=$(psql_query "SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid =
|
||||
c.relnamespace WHERE n.nspname = '$DB_SERVER_SCHEMA' AND c.relname = 'dbversion'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(psql_query "SELECT mandatory FROM ${DB_SERVER_SCHEMA}.dbversion" "${DB_SERVER_DBNAME}")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in PostgreSQL"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
psql_query "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" "${DB_SERVER_DBNAME}"
|
||||
fi
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/create.sql.gz"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/timescaledb.sql"
|
||||
fi
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
export ZBX_DB_SCHEMA="${DB_SERVER_SCHEMA}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|POSTGRES)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_postgresql
|
||||
check_db_connect_postgresql
|
||||
create_db_database_postgresql
|
||||
create_db_schema_postgresql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -161,6 +161,12 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-pgsql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
|
@ -169,8 +175,6 @@ VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
|||
|
||||
COPY docker-entrypoint.sh /usr/bin/
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
||||
CMD ["/usr/sbin/zabbix_server", "--foreground", "-c", "/etc/zabbix/zabbix_server.conf"]
|
||||
|
|
|
|||
|
|
@ -1,484 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
#Enable PostgreSQL timescaleDB feature:
|
||||
: ${ENABLE_TIMESCALEDB:="false"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for PostgreSQL database
|
||||
check_variables_postgresql() {
|
||||
: ${DB_SERVER_HOST="postgres-server"}
|
||||
: ${DB_SERVER_PORT:="5432"}
|
||||
|
||||
file_env POSTGRES_USER
|
||||
file_env POSTGRES_PASSWORD
|
||||
|
||||
DB_SERVER_ROOT_USER=${POSTGRES_USER:-"postgres"}
|
||||
DB_SERVER_ROOT_PASS=${POSTGRES_PASSWORD:-""}
|
||||
|
||||
DB_SERVER_ZBX_USER=${POSTGRES_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${POSTGRES_PASSWORD:-"zabbix"}
|
||||
|
||||
: ${DB_SERVER_SCHEMA:="public"}
|
||||
|
||||
DB_SERVER_DBNAME=${POSTGRES_DB:-"zabbix"}
|
||||
|
||||
: ${POSTGRES_USE_IMPLICIT_SEARCH_PATH:="false"}
|
||||
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
psql_connect_args="--host ${DB_SERVER_HOST} --port ${DB_SERVER_PORT}"
|
||||
else
|
||||
psql_connect_args="--port ${DB_SERVER_PORT}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_db_connect_postgresql() {
|
||||
echo "********************"
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_HOST: Using DB socket"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
echo "* DB_SERVER_SCHEMA: ${DB_SERVER_SCHEMA}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
while true :
|
||||
do
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --quiet 1>/dev/null 2>&1 && break
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --dbname ${DB_SERVER_DBNAME} --quiet 1>/dev/null 2>&1 && break
|
||||
|
||||
echo "**** PostgreSQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
psql_query() {
|
||||
query=$1
|
||||
db=$2
|
||||
|
||||
local result=""
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
result=$(psql --no-align --quiet --tuples-only $psql_connect_args \
|
||||
--username "${DB_SERVER_ROOT_USER}" --command "$query" --dbname "$db" 2>/dev/null);
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command $sql_script | psql --quiet \
|
||||
$psql_connect_args \
|
||||
--username "${DB_SERVER_ZBX_USER}" --dbname "${DB_SERVER_DBNAME}" 1>/dev/null || exit 1
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
create_db_database_postgresql() {
|
||||
DB_EXISTS=$(psql_query "SELECT 1 AS result FROM pg_database WHERE datname='${DB_SERVER_DBNAME}'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
createdb $psql_connect_args --username "${DB_SERVER_ROOT_USER}" \
|
||||
--owner "${DB_SERVER_ZBX_USER}" --lc-ctype "en_US.utf8" --lc-collate "en_US.utf8" "${DB_SERVER_DBNAME}"
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database owner!"
|
||||
fi
|
||||
|
||||
psql_query "CREATE SCHEMA IF NOT EXISTS ${DB_SERVER_SCHEMA}" "${DB_SERVER_DBNAME}" 1>/dev/null
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_postgresql() {
|
||||
DBVERSION_TABLE_EXISTS=$(psql_query "SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid =
|
||||
c.relnamespace WHERE n.nspname = '$DB_SERVER_SCHEMA' AND c.relname = 'dbversion'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(psql_query "SELECT mandatory FROM ${DB_SERVER_SCHEMA}.dbversion" "${DB_SERVER_DBNAME}")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in PostgreSQL"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
psql_query "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" "${DB_SERVER_DBNAME}"
|
||||
fi
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/create.sql.gz"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/timescaledb.sql"
|
||||
fi
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
export ZBX_DB_SCHEMA="${DB_SERVER_SCHEMA}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|POSTGRES)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_postgresql
|
||||
check_db_connect_postgresql
|
||||
create_db_database_postgresql
|
||||
create_db_schema_postgresql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -143,14 +143,18 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
chmod g=u ${ZABBIX_CONF_DIR} && \
|
||||
/usr/sbin/zabbix_server -V
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/server-pgsql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
EXPOSE 10051/tcp
|
||||
|
||||
WORKDIR ${ZABBIX_USER_HOME_DIR}
|
||||
|
||||
VOLUME ["${ZABBIX_USER_HOME_DIR}/snmptraps", "${ZABBIX_USER_HOME_DIR}/export"]
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
|
||||
|
||||
USER 1997
|
||||
|
|
|
|||
|
|
@ -1,484 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
#Enable PostgreSQL timescaleDB feature:
|
||||
: ${ENABLE_TIMESCALEDB:="false"}
|
||||
|
||||
# Default directories
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
escape_spec_char() {
|
||||
local var_value=$1
|
||||
|
||||
var_value="${var_value//\\/\\\\}"
|
||||
var_value="${var_value//[$'\n']/}"
|
||||
var_value="${var_value//\//\\/}"
|
||||
var_value="${var_value//./\\.}"
|
||||
var_value="${var_value//\*/\\*}"
|
||||
var_value="${var_value//^/\\^}"
|
||||
var_value="${var_value//\$/\\\$}"
|
||||
var_value="${var_value//\&/\\\&}"
|
||||
var_value="${var_value//\[/\\[}"
|
||||
var_value="${var_value//\]/\\]}"
|
||||
|
||||
echo "$var_value"
|
||||
}
|
||||
|
||||
update_config_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
local is_multiple=$4
|
||||
|
||||
local masklist=("DBPassword TLSPSKIdentity")
|
||||
|
||||
if [ ! -f "$config_path" ]; then
|
||||
echo "**** Configuration file '$config_path' does not exist"
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ " ${masklist[@]} " =~ " $var_name " ]] && [ ! -z "$var_value" ]; then
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '****'. Enable DEBUG_MODE to view value ..."
|
||||
else
|
||||
echo -n "** Updating '$config_path' parameter \"$var_name\": '$var_value'..."
|
||||
fi
|
||||
|
||||
# Remove configuration parameter definition in case of unset or empty parameter value
|
||||
if [ -z "$var_value" ]; then
|
||||
sed -i -e "/^$var_name=/d" "$config_path"
|
||||
echo "removed"
|
||||
return
|
||||
fi
|
||||
|
||||
# Remove value from configuration parameter in case of set to double quoted parameter value
|
||||
if [[ "$var_value" == '""' ]]; then
|
||||
if [ "$(grep -E "^$var_name=" $config_path)" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=/" "$config_path"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=/" "$config_path"
|
||||
fi
|
||||
echo "undefined"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use full path to a file for TLS related configuration parameters
|
||||
if [[ $var_name =~ ^TLS.*File$ ]] && [[ ! $var_value =~ ^/.+$ ]]; then
|
||||
var_value=$ZABBIX_USER_HOME_DIR/enc/$var_value
|
||||
fi
|
||||
|
||||
# Escaping characters in parameter value and name
|
||||
var_value=$(escape_spec_char "$var_value")
|
||||
var_name=$(escape_spec_char "$var_name")
|
||||
|
||||
if [ "$(grep -E "^$var_name=$var_value$" $config_path)" ]; then
|
||||
echo "exists"
|
||||
elif [ "$(grep -E "^$var_name=" $config_path)" ] && [ "$is_multiple" != "true" ]; then
|
||||
sed -i -e "/^$var_name=/s/=.*/=$var_value/" "$config_path"
|
||||
echo "updated"
|
||||
elif [ "$(grep -Ec "^# $var_name=" $config_path)" -gt 1 ]; then
|
||||
sed -i -e "/^[#;] $var_name=$/i\\$var_name=$var_value" "$config_path"
|
||||
echo "added first occurrence"
|
||||
else
|
||||
sed -i -e "/^[#;] $var_name=/s/.*/&\n$var_name=$var_value/" "$config_path"
|
||||
echo "added"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
update_config_multiple_var() {
|
||||
local config_path=$1
|
||||
local var_name=$2
|
||||
local var_value=$3
|
||||
|
||||
var_value="${var_value%\"}"
|
||||
var_value="${var_value#\"}"
|
||||
|
||||
local IFS=,
|
||||
local OPT_LIST=($var_value)
|
||||
|
||||
for value in "${OPT_LIST[@]}"; do
|
||||
update_config_var $config_path $var_name $value true
|
||||
done
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
if [ -n "$var_value" ]; then
|
||||
export "$var_name"="$file_name"
|
||||
fi
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for PostgreSQL database
|
||||
check_variables_postgresql() {
|
||||
: ${DB_SERVER_HOST="postgres-server"}
|
||||
: ${DB_SERVER_PORT:="5432"}
|
||||
|
||||
file_env POSTGRES_USER
|
||||
file_env POSTGRES_PASSWORD
|
||||
|
||||
DB_SERVER_ROOT_USER=${POSTGRES_USER:-"postgres"}
|
||||
DB_SERVER_ROOT_PASS=${POSTGRES_PASSWORD:-""}
|
||||
|
||||
DB_SERVER_ZBX_USER=${POSTGRES_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${POSTGRES_PASSWORD:-"zabbix"}
|
||||
|
||||
: ${DB_SERVER_SCHEMA:="public"}
|
||||
|
||||
DB_SERVER_DBNAME=${POSTGRES_DB:-"zabbix"}
|
||||
|
||||
: ${POSTGRES_USE_IMPLICIT_SEARCH_PATH:="false"}
|
||||
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
psql_connect_args="--host ${DB_SERVER_HOST} --port ${DB_SERVER_PORT}"
|
||||
else
|
||||
psql_connect_args="--port ${DB_SERVER_PORT}"
|
||||
fi
|
||||
}
|
||||
|
||||
check_db_connect_postgresql() {
|
||||
echo "********************"
|
||||
if [ -n "${DB_SERVER_HOST}" ]; then
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
else
|
||||
echo "* DB_SERVER_HOST: Using DB socket"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
echo "* DB_SERVER_SCHEMA: ${DB_SERVER_SCHEMA}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
while true :
|
||||
do
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --quiet 1>/dev/null 2>&1 && break
|
||||
psql $psql_connect_args --username ${DB_SERVER_ROOT_USER} --list --dbname ${DB_SERVER_DBNAME} --quiet 1>/dev/null 2>&1 && break
|
||||
|
||||
echo "**** PostgreSQL server is not available. Waiting $WAIT_TIMEOUT seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
psql_query() {
|
||||
query=$1
|
||||
db=$2
|
||||
|
||||
local result=""
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
result=$(psql --no-align --quiet --tuples-only $psql_connect_args \
|
||||
--username "${DB_SERVER_ROOT_USER}" --command "$query" --dbname "$db" 2>/dev/null);
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
exec_sql_file() {
|
||||
sql_script=$1
|
||||
|
||||
local command="cat"
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
if [ "${sql_script: -3}" == ".gz" ]; then
|
||||
command="zcat"
|
||||
fi
|
||||
|
||||
$command $sql_script | psql --quiet \
|
||||
$psql_connect_args \
|
||||
--username "${DB_SERVER_ZBX_USER}" --dbname "${DB_SERVER_DBNAME}" 1>/dev/null || exit 1
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
}
|
||||
|
||||
create_db_database_postgresql() {
|
||||
DB_EXISTS=$(psql_query "SELECT 1 AS result FROM pg_database WHERE datname='${DB_SERVER_DBNAME}'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -z ${DB_EXISTS} ]; then
|
||||
echo "** Database '${DB_SERVER_DBNAME}' does not exist. Creating..."
|
||||
|
||||
if [ -n "${DB_SERVER_ZBX_PASS}" ]; then
|
||||
export PGPASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
|
||||
if [ "${POSTGRES_USE_IMPLICIT_SEARCH_PATH,,}" == "false" ] && [ -n "${DB_SERVER_SCHEMA}" ]; then
|
||||
PGOPTIONS="--search_path=${DB_SERVER_SCHEMA}"
|
||||
export PGOPTIONS
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DBTLSCONNECT}" ]; then
|
||||
PGSSLMODE=${ZBX_DBTLSCONNECT//_/-}
|
||||
export PGSSLMODE=${PGSSLMODE//required/require}
|
||||
export PGSSLROOTCERT=${ZBX_DBTLSCAFILE}
|
||||
export PGSSLCERT=${ZBX_DBTLSCERTFILE}
|
||||
export PGSSLKEY=${ZBX_DBTLSKEYFILE}
|
||||
fi
|
||||
|
||||
createdb $psql_connect_args --username "${DB_SERVER_ROOT_USER}" \
|
||||
--owner "${DB_SERVER_ZBX_USER}" --lc-ctype "en_US.utf8" --lc-collate "en_US.utf8" "${DB_SERVER_DBNAME}"
|
||||
|
||||
unset PGPASSWORD
|
||||
unset PGOPTIONS
|
||||
unset PGSSLMODE
|
||||
unset PGSSLROOTCERT
|
||||
unset PGSSLCERT
|
||||
unset PGSSLKEY
|
||||
else
|
||||
echo "** Database '${DB_SERVER_DBNAME}' already exists. Please be careful with database owner!"
|
||||
fi
|
||||
|
||||
psql_query "CREATE SCHEMA IF NOT EXISTS ${DB_SERVER_SCHEMA}" "${DB_SERVER_DBNAME}" 1>/dev/null
|
||||
}
|
||||
|
||||
apply_db_scripts() {
|
||||
db_scripts=$1
|
||||
|
||||
for sql_script in $db_scripts; do
|
||||
[ -e "$sql_script" ] || continue
|
||||
echo "** Processing additional '$sql_script' SQL script"
|
||||
|
||||
exec_sql_file "$sql_script"
|
||||
done
|
||||
}
|
||||
|
||||
create_db_schema_postgresql() {
|
||||
DBVERSION_TABLE_EXISTS=$(psql_query "SELECT 1 FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid =
|
||||
c.relnamespace WHERE n.nspname = '$DB_SERVER_SCHEMA' AND c.relname = 'dbversion'" "${DB_SERVER_DBNAME}")
|
||||
|
||||
if [ -n "${DBVERSION_TABLE_EXISTS}" ]; then
|
||||
echo "** Table '${DB_SERVER_DBNAME}.dbversion' already exists."
|
||||
ZBX_DB_VERSION=$(psql_query "SELECT mandatory FROM ${DB_SERVER_SCHEMA}.dbversion" "${DB_SERVER_DBNAME}")
|
||||
fi
|
||||
|
||||
if [ -z "${ZBX_DB_VERSION}" ]; then
|
||||
echo "** Creating '${DB_SERVER_DBNAME}' schema in PostgreSQL"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
psql_query "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" "${DB_SERVER_DBNAME}"
|
||||
fi
|
||||
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/create.sql.gz"
|
||||
|
||||
if [ "${ENABLE_TIMESCALEDB,,}" == "true" ]; then
|
||||
exec_sql_file "/usr/share/doc/zabbix-server-postgresql/timescaledb.sql"
|
||||
fi
|
||||
|
||||
apply_db_scripts "${ZABBIX_USER_HOME_DIR}/dbscripts/*.sql"
|
||||
fi
|
||||
}
|
||||
|
||||
update_zbx_config() {
|
||||
export ZBX_DB_HOST="${DB_SERVER_HOST}"
|
||||
export ZBX_DB_PORT="${DB_SERVER_PORT}"
|
||||
|
||||
export ZBX_DB_NAME="${DB_SERVER_DBNAME}"
|
||||
export ZBX_DB_SCHEMA="${DB_SERVER_SCHEMA}"
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ] && [ -n "${ZBX_VAULTURL}" ] && [ ! -n "${ZBX_VAULTDBPATH}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
elif [ ! -n "${ZBX_VAULT}" ] && [ ! -n "${ZBX_VAULTURL}" ]; then
|
||||
export ZBX_DB_USER="${DB_SERVER_ZBX_USER}"
|
||||
export ZBX_DB_PASSWORD="${DB_SERVER_ZBX_PASS}"
|
||||
else
|
||||
unset ZBX_DB_USER
|
||||
unset ZBX_DB_PASSWORD
|
||||
fi
|
||||
|
||||
: ${ZBX_ENABLE_SNMP_TRAPS:="false"}
|
||||
[[ "${ZBX_ENABLE_SNMP_TRAPS,,}" == "true" ]] && export ZBX_STARTSNMPTRAPPER=1
|
||||
unset ZBX_ENABLE_SNMP_TRAPS
|
||||
|
||||
update_config_multiple_var "${ZABBIX_CONF_DIR}/zabbix_server_modules.conf" "LoadModule" "${ZBX_LOADMODULE}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCAFILE" "${ZBX_TLSCAFILE}" "${ZBX_TLSCA}"
|
||||
file_process_from_env "ZBX_TLSCRLFILE" "${ZBX_TLSCRLFILE}" "${ZBX_TLSCRL}"
|
||||
|
||||
file_process_from_env "ZBX_TLSCERTFILE" "${ZBX_TLSCERTFILE}" "${ZBX_TLSCERT}"
|
||||
file_process_from_env "ZBX_TLSKEYFILE" "${ZBX_TLSKEYFILE}" "${ZBX_TLSKEY}"
|
||||
|
||||
if [ "${ZBX_AUTOHANODENAME}" == 'fqdn' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname -f)"
|
||||
elif [ "${ZBX_AUTOHANODENAME}" == 'hostname' ] && [ ! -n "${ZBX_HANODENAME}" ]; then
|
||||
export ZBX_HANODENAME="$(hostname)"
|
||||
fi
|
||||
|
||||
: ${ZBX_NODEADDRESSPORT:="10051"}
|
||||
if [ "${ZBX_AUTONODEADDRESS}" == 'fqdn' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname -f):${ZBX_NODEADDRESSPORT}"
|
||||
elif [ "${ZBX_AUTONODEADDRESS}" == 'hostname' ] && [ ! -n "${ZBX_NODEADDRESS}" ]; then
|
||||
export ZBX_NODEADDRESS="$(hostname):${ZBX_NODEADDRESSPORT}"
|
||||
fi
|
||||
|
||||
if [ "$(id -u)" != '0' ]; then
|
||||
export ZBX_USER="$(whoami)"
|
||||
else
|
||||
export ZBX_ALLOWROOT=1
|
||||
fi
|
||||
|
||||
command -v openssl >/dev/null 2>&1 && openssl rehash -v "${ZBX_SSLCALOCATION}" 1>/dev/null
|
||||
}
|
||||
|
||||
clear_zbx_env() {
|
||||
[[ "${ZBX_CLEAR_ENV}" == "false" ]] && return
|
||||
|
||||
for env_var in $(env | grep -E "^(ZABBIX|DB|POSTGRES)_"); do
|
||||
unset "${env_var%%=*}"
|
||||
done
|
||||
}
|
||||
|
||||
prepare_db() {
|
||||
echo "** Preparing database"
|
||||
|
||||
check_variables_postgresql
|
||||
check_db_connect_postgresql
|
||||
create_db_database_postgresql
|
||||
create_db_schema_postgresql
|
||||
}
|
||||
|
||||
prepare_server() {
|
||||
echo "** Preparing Zabbix server"
|
||||
|
||||
prepare_db
|
||||
update_zbx_config
|
||||
clear_zbx_env
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
if [ "${1#-}" != "$1" ]; then
|
||||
set -- /usr/sbin/zabbix_server "$@"
|
||||
fi
|
||||
|
||||
if [ "$1" == '/usr/sbin/zabbix_server' ]; then
|
||||
prepare_server
|
||||
fi
|
||||
|
||||
if [ "$1" == "init_db_only" ]; then
|
||||
prepare_db
|
||||
else
|
||||
exec "$@"
|
||||
fi
|
||||
|
||||
#################################################
|
||||
|
|
@ -27,11 +27,9 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
|
||||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY conf/etc/logrotate.d/zabbix_snmptraps /etc/logrotate.d/
|
||||
COPY conf/etc/snmp/snmptrapd.conf /etc/snmp/
|
||||
COPY conf/usr/sbin/zabbix_trap_handler.sh conf/usr/sbin/snmptrapd_runner.sh /usr/sbin/
|
||||
|
||||
RUN set -eux && \
|
||||
RUN --mount=from=config_templates,target=/tmp/conf,ro \
|
||||
--mount=from=scripts,target=/tmp/scripts,ro \
|
||||
set -eux && \
|
||||
INSTALL_PKGS="bash \
|
||||
tzdata \
|
||||
net-snmp" && \
|
||||
|
|
@ -56,6 +54,10 @@ RUN set -eux && \
|
|||
${ZABBIX_USER_HOME_DIR}/snmptraps \
|
||||
${ZABBIX_USER_HOME_DIR}/mibs \
|
||||
${SNMP_PERSISTENT_DIR} && \
|
||||
cp /tmp/conf/logrotate.d/zabbix_snmptraps /etc/logrotate.d/ && \
|
||||
cp /tmp/conf/snmp/snmptrapd.conf /etc/snmp/ && \
|
||||
cp /tmp/scripts/zabbix_trap_handler.sh /usr/sbin/ && \
|
||||
cp /tmp/scripts/snmptrapd_runner.sh /usr/sbin/ && \
|
||||
FIX_PERM_LIST="\
|
||||
/etc/snmp/ \
|
||||
${ZABBIX_USER_HOME_DIR}/ \
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# SNMP Trap output configuration
|
||||
# S - Display the name of the MIB, as well as the object name (This is the default OID output format)
|
||||
# T - If values are printed as Hex strings, display a printable version as well
|
||||
# t - Display TimeTicks values as raw numbers
|
||||
# e - Removes the symbolic labels from enumeration values
|
||||
#
|
||||
: ${SNMPTRAP_OUTPUT_OPTIONS:="STte"}
|
||||
|
||||
DEFAULT_ARGS="-n -t -X -Lo -A -O${SNMPTRAP_OUTPUT_OPTIONS}"
|
||||
|
||||
CONF_FILE_LIST="/etc/snmp/snmptrapd.conf"
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd.conf"
|
||||
fi
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf"
|
||||
fi
|
||||
|
||||
/usr/sbin/snmptrapd --doNotFork=yes -C -c "$CONF_FILE_LIST" $DEFAULT_ARGS
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
ZABBIX_TRAPS_FILE="${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log"
|
||||
|
||||
ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y-%m-%dT%T%z"}
|
||||
|
||||
ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"}
|
||||
|
||||
ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"}
|
||||
|
||||
date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT")
|
||||
|
||||
# The name of the host that sent the notification, as determined by gethostbyaddr(3).
|
||||
# In fact this line is irrelevant and useless since snmptrapd basically attempts to
|
||||
# perform reverse name lookup for the transport address (see below).
|
||||
# In case of failure it will print "<UNKNOWN>"
|
||||
read host
|
||||
# The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]"
|
||||
read sender
|
||||
# The first OID should always be SNMPv2-MIB::sysUpTime.0
|
||||
#read uptime
|
||||
# the second should be SNMPv2-MIB::snmpTrapOID.0
|
||||
#read trapoid
|
||||
|
||||
# The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0.
|
||||
vars=
|
||||
while read oid val
|
||||
do
|
||||
if [ "$vars" = "" ]
|
||||
then
|
||||
vars="$oid = $val"
|
||||
else
|
||||
vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val"
|
||||
fi
|
||||
|
||||
if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then
|
||||
trap_address=$val
|
||||
fi
|
||||
done
|
||||
|
||||
[[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]}
|
||||
|
||||
! [ -z $trap_address ] && sender_addr=$trap_address
|
||||
|
||||
[[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host
|
||||
|
||||
# Header in Zabbix format shouldn't exist anywhere in vars, it is injection
|
||||
# Must exit with 0
|
||||
date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \
|
||||
-e 's/%Y/[0-9]\{4\}/g' \
|
||||
-e 's/%m/[0-9]\{2\}/g' \
|
||||
-e 's/%d/[0-9]\{2\}/g' \
|
||||
-e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \
|
||||
-e 's/%z/[\+\-][0-9]\{4\}/g' \
|
||||
-e 's/%H/[0-9]\{2\}/g' \
|
||||
-e 's/%M/[0-9]\{2\}/g' \
|
||||
-e 's/%S/[0-9]\{2\}/g')
|
||||
|
||||
zbx_trap_regex="$date_regex ZBXTRAP"
|
||||
echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0
|
||||
|
||||
echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE
|
||||
|
|
@ -27,12 +27,10 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
|
||||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY conf/etc/logrotate.d/zabbix_snmptraps /etc/logrotate.d/
|
||||
COPY conf/etc/snmp/snmptrapd.conf /etc/snmp/
|
||||
COPY conf/usr/sbin/zabbix_trap_handler.sh conf/usr/sbin/snmptrapd_runner.sh /usr/sbin/
|
||||
|
||||
RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
||||
--mount=type=tmpfs,target=/var/cache/yum/ \
|
||||
--mount=from=config_templates,target=/tmp/conf,ro \
|
||||
--mount=from=scripts,target=/tmp/scripts,ro \
|
||||
set -eux && \
|
||||
INSTALL_PKGS="bash \
|
||||
tzdata \
|
||||
|
|
@ -63,6 +61,10 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
${ZABBIX_USER_HOME_DIR}/snmptraps \
|
||||
${ZABBIX_USER_HOME_DIR}/mibs \
|
||||
${SNMP_PERSISTENT_DIR} && \
|
||||
cp /tmp/conf/logrotate.d/zabbix_snmptraps /etc/logrotate.d/ && \
|
||||
cp /tmp/conf/snmp/snmptrapd.conf /etc/snmp/ && \
|
||||
cp /tmp/scripts/zabbix_trap_handler.sh /usr/sbin/ && \
|
||||
cp /tmp/scripts/snmptrapd_runner.sh /usr/sbin/ && \
|
||||
FIX_PERM_LIST="\
|
||||
/etc/snmp/ \
|
||||
${ZABBIX_USER_HOME_DIR}/ \
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
# https://support.zabbix.com/browse/ZBX-9858
|
||||
/var/lib/zabbix/snmptraps/snmptraps.log {
|
||||
missingok
|
||||
daily
|
||||
rotate 0
|
||||
minsize 50M
|
||||
notifempty
|
||||
su zabbix zabbix
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
# A list of listening addresses, on which to receive incoming SNMP notifications
|
||||
snmpTrapdAddr udp:1162
|
||||
snmpTrapdAddr udp6:1162
|
||||
|
||||
# Do not fork from the calling shell
|
||||
doNotFork yes
|
||||
# File in which to store the process ID of the notification receiver
|
||||
pidFile /tmp/snmptrapd.pid
|
||||
# Disables support for the NOTIFICATION-LOG-MIB
|
||||
#doNotRetainNotificationLogs yes
|
||||
|
||||
authCommunity log,execute,net public
|
||||
disableAuthorization yes
|
||||
ignoreAuthFailure yes
|
||||
|
||||
# Specify the format used for trap handle location
|
||||
#format execute %B\n%b\n%V\n%v\n
|
||||
|
||||
# o - Log messages to the standard output stream.
|
||||
# logOption o
|
||||
|
||||
# Invokes the specified program (with the given arguments) whenever a notification
|
||||
# is received that matches the OID token
|
||||
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# SNMP Trap output configuration
|
||||
# S - Display the name of the MIB, as well as the object name (This is the default OID output format)
|
||||
# T - If values are printed as Hex strings, display a printable version as well
|
||||
# t - Display TimeTicks values as raw numbers
|
||||
# e - Removes the symbolic labels from enumeration values
|
||||
#
|
||||
: ${SNMPTRAP_OUTPUT_OPTIONS:="STte"}
|
||||
|
||||
DEFAULT_ARGS="-n -t -X -Lo -A -O${SNMPTRAP_OUTPUT_OPTIONS}"
|
||||
|
||||
CONF_FILE_LIST="/etc/snmp/snmptrapd.conf"
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd.conf"
|
||||
fi
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf"
|
||||
fi
|
||||
|
||||
/usr/sbin/snmptrapd --doNotFork=yes -C -c "$CONF_FILE_LIST" $DEFAULT_ARGS
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
ZABBIX_TRAPS_FILE="${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log"
|
||||
|
||||
ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y-%m-%dT%T%z"}
|
||||
|
||||
ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"}
|
||||
|
||||
ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"}
|
||||
|
||||
date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT")
|
||||
|
||||
# The name of the host that sent the notification, as determined by gethostbyaddr(3).
|
||||
# In fact this line is irrelevant and useless since snmptrapd basically attempts to
|
||||
# perform reverse name lookup for the transport address (see below).
|
||||
# In case of failure it will print "<UNKNOWN>"
|
||||
read host
|
||||
# The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]"
|
||||
read sender
|
||||
# The first OID should always be SNMPv2-MIB::sysUpTime.0
|
||||
#read uptime
|
||||
# the second should be SNMPv2-MIB::snmpTrapOID.0
|
||||
#read trapoid
|
||||
|
||||
# The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0.
|
||||
vars=
|
||||
while read oid val
|
||||
do
|
||||
if [ "$vars" = "" ]
|
||||
then
|
||||
vars="$oid = $val"
|
||||
else
|
||||
vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val"
|
||||
fi
|
||||
|
||||
if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then
|
||||
trap_address=$val
|
||||
fi
|
||||
done
|
||||
|
||||
[[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]}
|
||||
|
||||
! [ -z $trap_address ] && sender_addr=$trap_address
|
||||
|
||||
[[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host
|
||||
|
||||
# Header in Zabbix format shouldn't exist anywhere in vars, it is injection
|
||||
# Must exit with 0
|
||||
date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \
|
||||
-e 's/%Y/[0-9]\{4\}/g' \
|
||||
-e 's/%m/[0-9]\{2\}/g' \
|
||||
-e 's/%d/[0-9]\{2\}/g' \
|
||||
-e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \
|
||||
-e 's/%z/[\+\-][0-9]\{4\}/g' \
|
||||
-e 's/%H/[0-9]\{2\}/g' \
|
||||
-e 's/%M/[0-9]\{2\}/g' \
|
||||
-e 's/%S/[0-9]\{2\}/g')
|
||||
|
||||
zbx_trap_regex="$date_regex ZBXTRAP"
|
||||
echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0
|
||||
|
||||
echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE
|
||||
|
|
@ -27,12 +27,10 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
|
||||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY conf/etc/logrotate.d/zabbix_snmptraps /etc/logrotate.d/
|
||||
COPY conf/etc/snmp/snmptrapd.conf /etc/snmp/
|
||||
COPY conf/usr/sbin/zabbix_trap_handler.sh conf/usr/sbin/snmptrapd_runner.sh /usr/sbin/
|
||||
|
||||
RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
||||
--mount=type=tmpfs,target=/var/cache/yum/ \
|
||||
--mount=from=config_templates,target=/tmp/conf,ro \
|
||||
--mount=from=scripts,target=/tmp/scripts,ro \
|
||||
set -eux && \
|
||||
INSTALL_PKGS="bash \
|
||||
net-snmp" && \
|
||||
|
|
@ -61,6 +59,10 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
${ZABBIX_USER_HOME_DIR}/snmptraps \
|
||||
${ZABBIX_USER_HOME_DIR}/mibs \
|
||||
${SNMP_PERSISTENT_DIR} && \
|
||||
cp /tmp/conf/logrotate.d/zabbix_snmptraps /etc/logrotate.d/ && \
|
||||
cp /tmp/conf/snmp/snmptrapd.conf /etc/snmp/ && \
|
||||
cp /tmp/scripts/zabbix_trap_handler.sh /usr/sbin/ && \
|
||||
cp /tmp/scripts/snmptrapd_runner.sh /usr/sbin/ && \
|
||||
FIX_PERM_LIST="\
|
||||
/etc/snmp/ \
|
||||
${ZABBIX_USER_HOME_DIR}/ \
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
# https://support.zabbix.com/browse/ZBX-9858
|
||||
/var/lib/zabbix/snmptraps/snmptraps.log {
|
||||
missingok
|
||||
daily
|
||||
rotate 0
|
||||
minsize 50M
|
||||
notifempty
|
||||
su zabbix zabbix
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
# A list of listening addresses, on which to receive incoming SNMP notifications
|
||||
snmpTrapdAddr udp:1162
|
||||
snmpTrapdAddr udp6:1162
|
||||
|
||||
# Do not fork from the calling shell
|
||||
doNotFork yes
|
||||
# File in which to store the process ID of the notification receiver
|
||||
pidFile /tmp/snmptrapd.pid
|
||||
# Disables support for the NOTIFICATION-LOG-MIB
|
||||
#doNotRetainNotificationLogs yes
|
||||
|
||||
authCommunity log,execute,net public
|
||||
disableAuthorization yes
|
||||
ignoreAuthFailure yes
|
||||
|
||||
# Specify the format used for trap handle location
|
||||
#format execute %B\n%b\n%V\n%v\n
|
||||
|
||||
# o - Log messages to the standard output stream.
|
||||
# logOption o
|
||||
|
||||
# Invokes the specified program (with the given arguments) whenever a notification
|
||||
# is received that matches the OID token
|
||||
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# SNMP Trap output configuration
|
||||
# S - Display the name of the MIB, as well as the object name (This is the default OID output format)
|
||||
# T - If values are printed as Hex strings, display a printable version as well
|
||||
# t - Display TimeTicks values as raw numbers
|
||||
# e - Removes the symbolic labels from enumeration values
|
||||
#
|
||||
: ${SNMPTRAP_OUTPUT_OPTIONS:="STte"}
|
||||
|
||||
DEFAULT_ARGS="-n -t -X -Lo -A -O${SNMPTRAP_OUTPUT_OPTIONS}"
|
||||
|
||||
CONF_FILE_LIST="/etc/snmp/snmptrapd.conf"
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd.conf"
|
||||
fi
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf"
|
||||
fi
|
||||
|
||||
/usr/sbin/snmptrapd --doNotFork=yes -C -c "$CONF_FILE_LIST" $DEFAULT_ARGS
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
ZABBIX_TRAPS_FILE="${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log"
|
||||
|
||||
ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y-%m-%dT%T%z"}
|
||||
|
||||
ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"}
|
||||
|
||||
ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"}
|
||||
|
||||
date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT")
|
||||
|
||||
# The name of the host that sent the notification, as determined by gethostbyaddr(3).
|
||||
# In fact this line is irrelevant and useless since snmptrapd basically attempts to
|
||||
# perform reverse name lookup for the transport address (see below).
|
||||
# In case of failure it will print "<UNKNOWN>"
|
||||
read host
|
||||
# The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]"
|
||||
read sender
|
||||
# The first OID should always be SNMPv2-MIB::sysUpTime.0
|
||||
#read uptime
|
||||
# the second should be SNMPv2-MIB::snmpTrapOID.0
|
||||
#read trapoid
|
||||
|
||||
# The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0.
|
||||
vars=
|
||||
while read oid val
|
||||
do
|
||||
if [ "$vars" = "" ]
|
||||
then
|
||||
vars="$oid = $val"
|
||||
else
|
||||
vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val"
|
||||
fi
|
||||
|
||||
if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then
|
||||
trap_address=$val
|
||||
fi
|
||||
done
|
||||
|
||||
[[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]}
|
||||
|
||||
! [ -z $trap_address ] && sender_addr=$trap_address
|
||||
|
||||
[[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host
|
||||
|
||||
# Header in Zabbix format shouldn't exist anywhere in vars, it is injection
|
||||
# Must exit with 0
|
||||
date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \
|
||||
-e 's/%Y/[0-9]\{4\}/g' \
|
||||
-e 's/%m/[0-9]\{2\}/g' \
|
||||
-e 's/%d/[0-9]\{2\}/g' \
|
||||
-e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \
|
||||
-e 's/%z/[\+\-][0-9]\{4\}/g' \
|
||||
-e 's/%H/[0-9]\{2\}/g' \
|
||||
-e 's/%M/[0-9]\{2\}/g' \
|
||||
-e 's/%S/[0-9]\{2\}/g')
|
||||
|
||||
zbx_trap_regex="$date_regex ZBXTRAP"
|
||||
echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0
|
||||
|
||||
echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE
|
||||
|
|
@ -47,12 +47,11 @@ LABEL description="Zabbix SNMP traps receiver" \
|
|||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY licenses /licenses/
|
||||
COPY conf/etc/logrotate.d/zabbix_snmptraps /etc/logrotate.d/
|
||||
COPY conf/etc/snmp/snmptrapd.conf /etc/snmp/
|
||||
COPY conf/usr/sbin/zabbix_trap_handler.sh conf/usr/sbin/snmptrapd_runner.sh /usr/sbin/
|
||||
|
||||
RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
||||
--mount=type=tmpfs,target=/var/cache/yum/ \
|
||||
--mount=from=config_templates,target=/tmp/conf,ro \
|
||||
--mount=from=scripts,target=/tmp/scripts,ro \
|
||||
set -eux && \
|
||||
INSTALL_PKGS="bash \
|
||||
shadow-utils \
|
||||
|
|
@ -91,6 +90,10 @@ RUN --mount=type=tmpfs,target=/var/lib/dnf/ \
|
|||
${ZABBIX_USER_HOME_DIR}/snmptraps \
|
||||
${ZABBIX_USER_HOME_DIR}/mibs \
|
||||
${SNMP_PERSISTENT_DIR} && \
|
||||
cp /tmp/conf/logrotate.d/zabbix_snmptraps /etc/logrotate.d/ && \
|
||||
cp /tmp/conf/snmp/snmptrapd.conf /etc/snmp/ && \
|
||||
cp /tmp/scripts/zabbix_trap_handler.sh /usr/sbin/ && \
|
||||
cp /tmp/scripts/snmptrapd_runner.sh /usr/sbin/ && \
|
||||
FIX_PERM_LIST="\
|
||||
/etc/snmp/ \
|
||||
${ZABBIX_USER_HOME_DIR}/ \
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
# https://support.zabbix.com/browse/ZBX-9858
|
||||
/var/lib/zabbix/snmptraps/snmptraps.log {
|
||||
missingok
|
||||
daily
|
||||
rotate 0
|
||||
minsize 50M
|
||||
notifempty
|
||||
su zabbix zabbix
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
# A list of listening addresses, on which to receive incoming SNMP notifications
|
||||
snmpTrapdAddr udp:1162
|
||||
snmpTrapdAddr udp6:1162
|
||||
|
||||
# Do not fork from the calling shell
|
||||
doNotFork yes
|
||||
# File in which to store the process ID of the notification receiver
|
||||
pidFile /tmp/snmptrapd.pid
|
||||
# Disables support for the NOTIFICATION-LOG-MIB
|
||||
#doNotRetainNotificationLogs yes
|
||||
|
||||
authCommunity log,execute,net public
|
||||
disableAuthorization yes
|
||||
ignoreAuthFailure yes
|
||||
|
||||
# Specify the format used for trap handle location
|
||||
#format execute %B\n%b\n%V\n%v\n
|
||||
|
||||
# o - Log messages to the standard output stream.
|
||||
# logOption o
|
||||
|
||||
# Invokes the specified program (with the given arguments) whenever a notification
|
||||
# is received that matches the OID token
|
||||
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# SNMP Trap output configuration
|
||||
# S - Display the name of the MIB, as well as the object name (This is the default OID output format)
|
||||
# T - If values are printed as Hex strings, display a printable version as well
|
||||
# t - Display TimeTicks values as raw numbers
|
||||
# e - Removes the symbolic labels from enumeration values
|
||||
#
|
||||
: ${SNMPTRAP_OUTPUT_OPTIONS:="STte"}
|
||||
|
||||
DEFAULT_ARGS="-n -t -X -Lo -A -O${SNMPTRAP_OUTPUT_OPTIONS}"
|
||||
|
||||
CONF_FILE_LIST="/etc/snmp/snmptrapd.conf"
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd.conf"
|
||||
fi
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf"
|
||||
fi
|
||||
|
||||
/usr/sbin/snmptrapd --doNotFork=yes -C -c "$CONF_FILE_LIST" $DEFAULT_ARGS
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
ZABBIX_TRAPS_FILE="${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log"
|
||||
|
||||
ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y-%m-%dT%T%z"}
|
||||
|
||||
ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"}
|
||||
|
||||
ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"}
|
||||
|
||||
date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT")
|
||||
|
||||
# The name of the host that sent the notification, as determined by gethostbyaddr(3).
|
||||
# In fact this line is irrelevant and useless since snmptrapd basically attempts to
|
||||
# perform reverse name lookup for the transport address (see below).
|
||||
# In case of failure it will print "<UNKNOWN>"
|
||||
read host
|
||||
# The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]"
|
||||
read sender
|
||||
# The first OID should always be SNMPv2-MIB::sysUpTime.0
|
||||
#read uptime
|
||||
# the second should be SNMPv2-MIB::snmpTrapOID.0
|
||||
#read trapoid
|
||||
|
||||
# The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0.
|
||||
vars=
|
||||
while read oid val
|
||||
do
|
||||
if [ "$vars" = "" ]
|
||||
then
|
||||
vars="$oid = $val"
|
||||
else
|
||||
vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val"
|
||||
fi
|
||||
|
||||
if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then
|
||||
trap_address=$val
|
||||
fi
|
||||
done
|
||||
|
||||
[[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]}
|
||||
|
||||
! [ -z $trap_address ] && sender_addr=$trap_address
|
||||
|
||||
[[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host
|
||||
|
||||
# Header in Zabbix format shouldn't exist anywhere in vars, it is injection
|
||||
# Must exit with 0
|
||||
date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \
|
||||
-e 's/%Y/[0-9]\{4\}/g' \
|
||||
-e 's/%m/[0-9]\{2\}/g' \
|
||||
-e 's/%d/[0-9]\{2\}/g' \
|
||||
-e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \
|
||||
-e 's/%z/[\+\-][0-9]\{4\}/g' \
|
||||
-e 's/%H/[0-9]\{2\}/g' \
|
||||
-e 's/%M/[0-9]\{2\}/g' \
|
||||
-e 's/%S/[0-9]\{2\}/g')
|
||||
|
||||
zbx_trap_regex="$date_regex ZBXTRAP"
|
||||
echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0
|
||||
|
||||
echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE
|
||||
|
|
@ -27,12 +27,10 @@ LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zab
|
|||
|
||||
STOPSIGNAL SIGTERM
|
||||
|
||||
COPY conf/etc/logrotate.d/zabbix_snmptraps /etc/logrotate.d/
|
||||
COPY conf/etc/snmp/snmptrapd.conf /etc/snmp/
|
||||
COPY conf/usr/sbin/zabbix_trap_handler.sh conf/usr/sbin/snmptrapd_runner.sh /usr/sbin/
|
||||
|
||||
RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
||||
--mount=type=cache,target=/var/lib/apt/,sharing=locked \
|
||||
--mount=from=config_templates,target=/tmp/conf,ro \
|
||||
--mount=from=scripts,target=/tmp/scripts,ro \
|
||||
set -eux && \
|
||||
printf '%s\n' '#!/bin/sh' 'exit 101' > /usr/sbin/policy-rc.d && \
|
||||
chmod +x /usr/sbin/policy-rc.d && \
|
||||
|
|
@ -63,6 +61,10 @@ RUN --mount=type=cache,target=/var/cache/apt/,sharing=locked \
|
|||
${ZABBIX_USER_HOME_DIR}/snmptraps \
|
||||
${ZABBIX_USER_HOME_DIR}/mibs \
|
||||
${SNMP_PERSISTENT_DIR} && \
|
||||
cp /tmp/conf/logrotate.d/zabbix_snmptraps /etc/logrotate.d/ && \
|
||||
cp /tmp/conf/snmp/snmptrapd.conf /etc/snmp/ && \
|
||||
cp /tmp/scripts/zabbix_trap_handler.sh /usr/sbin/ && \
|
||||
cp /tmp/scripts/snmptrapd_runner.sh /usr/sbin/ && \
|
||||
FIX_PERM_LIST="\
|
||||
/etc/snmp/ \
|
||||
${ZABBIX_USER_HOME_DIR}/ \
|
||||
|
|
|
|||
|
|
@ -1,9 +0,0 @@
|
|||
# https://support.zabbix.com/browse/ZBX-9858
|
||||
/var/lib/zabbix/snmptraps/snmptraps.log {
|
||||
missingok
|
||||
daily
|
||||
rotate 0
|
||||
minsize 50M
|
||||
notifempty
|
||||
su zabbix zabbix
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
# A list of listening addresses, on which to receive incoming SNMP notifications
|
||||
snmpTrapdAddr udp:1162
|
||||
snmpTrapdAddr udp6:1162
|
||||
|
||||
# Do not fork from the calling shell
|
||||
doNotFork yes
|
||||
# File in which to store the process ID of the notification receiver
|
||||
pidFile /tmp/snmptrapd.pid
|
||||
# Disables support for the NOTIFICATION-LOG-MIB
|
||||
#doNotRetainNotificationLogs yes
|
||||
|
||||
authCommunity log,execute,net public
|
||||
disableAuthorization yes
|
||||
ignoreAuthFailure yes
|
||||
|
||||
# Specify the format used for trap handle location
|
||||
#format execute %B\n%b\n%V\n%v\n
|
||||
|
||||
# o - Log messages to the standard output stream.
|
||||
# logOption o
|
||||
|
||||
# Invokes the specified program (with the given arguments) whenever a notification
|
||||
# is received that matches the OID token
|
||||
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
# SNMP Trap output configuration
|
||||
# S - Display the name of the MIB, as well as the object name (This is the default OID output format)
|
||||
# T - If values are printed as Hex strings, display a printable version as well
|
||||
# t - Display TimeTicks values as raw numbers
|
||||
# e - Removes the symbolic labels from enumeration values
|
||||
#
|
||||
: ${SNMPTRAP_OUTPUT_OPTIONS:="STte"}
|
||||
|
||||
DEFAULT_ARGS="-n -t -X -Lo -A -O${SNMPTRAP_OUTPUT_OPTIONS}"
|
||||
|
||||
CONF_FILE_LIST="/etc/snmp/snmptrapd.conf"
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd.conf"
|
||||
fi
|
||||
|
||||
if [ -f "$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf" ]; then
|
||||
CONF_FILE_LIST="$CONF_FILE_LIST,$SNMP_PERSISTENT_DIR/snmptrapd_custom.conf"
|
||||
fi
|
||||
|
||||
/usr/sbin/snmptrapd --doNotFork=yes -C -c "$CONF_FILE_LIST" $DEFAULT_ARGS
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
ZABBIX_TRAPS_FILE="${ZABBIX_USER_HOME_DIR}/snmptraps/snmptraps.log"
|
||||
|
||||
ZBX_SNMP_TRAP_DATE_FORMAT=${ZBX_SNMP_TRAP_DATE_FORMAT:-"+%Y-%m-%dT%T%z"}
|
||||
|
||||
ZBX_SNMP_TRAP_FORMAT=${ZBX_SNMP_TRAP_FORMAT:-"\n"}
|
||||
|
||||
ZBX_SNMP_TRAP_USE_DNS=${ZBX_SNMP_TRAP_USE_DNS:-"false"}
|
||||
|
||||
date=$(date "$ZBX_SNMP_TRAP_DATE_FORMAT")
|
||||
|
||||
# The name of the host that sent the notification, as determined by gethostbyaddr(3).
|
||||
# In fact this line is irrelevant and useless since snmptrapd basically attempts to
|
||||
# perform reverse name lookup for the transport address (see below).
|
||||
# In case of failure it will print "<UNKNOWN>"
|
||||
read host
|
||||
# The transport address, like "[UDP: [172.16.10.12]:23456->[10.150.0.8]]"
|
||||
read sender
|
||||
# The first OID should always be SNMPv2-MIB::sysUpTime.0
|
||||
#read uptime
|
||||
# the second should be SNMPv2-MIB::snmpTrapOID.0
|
||||
#read trapoid
|
||||
|
||||
# The remaining lines will contain the payload varbind list. For SNMPv1 traps, the final OID will be SNMPv2-MIB::snmpTrapEnterprise.0.
|
||||
vars=
|
||||
while read oid val
|
||||
do
|
||||
if [ "$vars" = "" ]
|
||||
then
|
||||
vars="$oid = $val"
|
||||
else
|
||||
vars="$vars$ZBX_SNMP_TRAP_FORMAT$oid = $val"
|
||||
fi
|
||||
|
||||
if [[ "$oid" =~ snmpTrapAddress\.0 ]] || [[ "$oid" =~ 1\.3\.6\.1\.6\.3\.18\.1\.3\.0 ]]; then
|
||||
trap_address=$val
|
||||
fi
|
||||
done
|
||||
|
||||
[[ ${sender} =~ \[(.*?)\].*\-\> ]] && sender_addr=${BASH_REMATCH[1]}
|
||||
|
||||
! [ -z $trap_address ] && sender_addr=$trap_address
|
||||
|
||||
[[ "$ZBX_SNMP_TRAP_USE_DNS" == "true" ]] && ! [[ ${host} =~ \[(.*?)\].*\-\> ]] && sender_addr=$host
|
||||
|
||||
# Header in Zabbix format shouldn't exist anywhere in vars, it is injection
|
||||
# Must exit with 0
|
||||
date_regex=$(echo "$ZBX_SNMP_TRAP_DATE_FORMAT" | sed -e 's/^+//g' \
|
||||
-e 's/%Y/[0-9]\{4\}/g' \
|
||||
-e 's/%m/[0-9]\{2\}/g' \
|
||||
-e 's/%d/[0-9]\{2\}/g' \
|
||||
-e 's/%T/[0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}/g' \
|
||||
-e 's/%z/[\+\-][0-9]\{4\}/g' \
|
||||
-e 's/%H/[0-9]\{2\}/g' \
|
||||
-e 's/%M/[0-9]\{2\}/g' \
|
||||
-e 's/%S/[0-9]\{2\}/g')
|
||||
|
||||
zbx_trap_regex="$date_regex ZBXTRAP"
|
||||
echo "$vars" | grep -qE "$zbx_trap_regex" && exit 0
|
||||
|
||||
echo -e "$date ZBXTRAP $sender_addr$ZBX_SNMP_TRAP_FORMAT$sender$ZBX_SNMP_TRAP_FORMAT$vars" >> $ZABBIX_TRAPS_FILE
|
||||
|
|
@ -31,6 +31,12 @@ ENV TERM=xterm \
|
|||
ZABBIX_USER_HOME_DIR=/var/lib/zabbix \
|
||||
ZABBIX_WWW_ROOT=/usr/share/zabbix
|
||||
|
||||
ENV DB_ENGINE=mariadb \
|
||||
APACHE_RUN_DIR="/tmp/apache2" \
|
||||
HTTPD_CONF_FILE="/etc/apache2/httpd.conf" \
|
||||
APACHE_SITES_DIR="/etc/apache2/conf.d" \
|
||||
PHP_CONFIG_FILE="/etc/php84/php-fpm.d/zabbix.conf"
|
||||
|
||||
LABEL org.opencontainers.image.authors="Alexey Pustovalov <alexey.pustovalov@zabbix.com>" \
|
||||
org.opencontainers.image.description="Zabbix web-interface based on Apache2 web server with MySQL database support" \
|
||||
org.opencontainers.image.documentation="https://www.zabbix.com/documentation/${MAJOR_VERSION}/manual/installation/containers" \
|
||||
|
|
@ -124,6 +130,12 @@ RUN set -eux && \
|
|||
chown --quiet -R zabbix:0 ${FIX_PERM_LIST} && \
|
||||
chmod -R g=u ${FIX_PERM_LIST}
|
||||
|
||||
RUN --mount=from=entrypoints,target=/tmp/entrypoints,ro \
|
||||
set -eux && \
|
||||
install -d /usr/lib/docker-entrypoint && \
|
||||
install -m 0755 /tmp/entrypoints/web-apache-mysql.sh /usr/bin/docker-entrypoint.sh && \
|
||||
install -m 0644 /tmp/entrypoints/lib/*.sh /usr/lib/docker-entrypoint/
|
||||
|
||||
HEALTHCHECK --interval=1m30s --timeout=3s --retries=3 --start-period=40s --start-interval=5s \
|
||||
CMD curl -f http://localhost:8080/ping || exit 1
|
||||
|
||||
|
|
@ -131,8 +143,6 @@ EXPOSE 8080/tcp 8443/tcp
|
|||
|
||||
WORKDIR ${ZABBIX_WWW_ROOT}
|
||||
|
||||
COPY ["docker-entrypoint.sh", "/usr/bin/"]
|
||||
|
||||
USER 1997
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
|
|
|
|||
|
|
@ -1,381 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -o pipefail
|
||||
|
||||
set +e
|
||||
|
||||
# Script trace mode
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
set -o xtrace
|
||||
fi
|
||||
|
||||
# Internal directory for TLS related files, used when TLS*File specified as plain text values
|
||||
ZABBIX_INTERNAL_ENC_DIR="${ZABBIX_USER_HOME_DIR}/enc_internal"
|
||||
|
||||
# Default Zabbix installation name
|
||||
# Used only by Zabbix web-interface
|
||||
: ${ZBX_SERVER_NAME:="Zabbix docker"}
|
||||
# Default Zabbix server port number
|
||||
: ${ZBX_SERVER_PORT:="10051"}
|
||||
|
||||
# Default timezone for web interface
|
||||
: ${PHP_TZ:="Europe/Riga"}
|
||||
|
||||
# Default user settings
|
||||
: ${DAEMON_USER:="apache"}
|
||||
: ${DAEMON_GROUP:="apache"}
|
||||
|
||||
# DefaultRuntimeDir configuration option value
|
||||
export APACHE_RUN_DIR="/tmp/apache2"
|
||||
|
||||
# Default directories
|
||||
# Apache main configuration file
|
||||
HTTPD_CONF_FILE="/etc/apache2/httpd.conf"
|
||||
# Apache additional configuration files directory
|
||||
APACHE_SITES_DIR="/etc/apache2/conf.d"
|
||||
# Directory with SSL certificate files for Apache
|
||||
APACHE_SSL_CONFIG_DIR="/etc/ssl/apache2"
|
||||
# PHP-FPM configuration file
|
||||
PHP_CONFIG_FILE="/etc/php84/php-fpm.d/zabbix.conf"
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
# as example: file_env 'MYSQL_PASSWORD' 'zabbix'
|
||||
# (will allow for "$MYSQL_PASSWORD_FILE" to fill in the value of "$MYSQL_PASSWORD" from a file)
|
||||
# unsets the VAR_FILE afterwards and just leaving VAR
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local defaultValue="${2:-}"
|
||||
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo "**** Both variables $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
local val="$defaultValue"
|
||||
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
echo "** Using ${var} variable from ENV"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
if [ ! -f "${!fileVar}" ]; then
|
||||
echo "**** Secret file \"${!fileVar}\" is not found"
|
||||
exit 1
|
||||
fi
|
||||
val="$(< "${!fileVar}")"
|
||||
echo "** Using ${var} variable from secret file"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
file_process_from_env() {
|
||||
local var_name=$1
|
||||
local file_name=$2
|
||||
local var_value=$3
|
||||
|
||||
if [ ! -z "$var_value" ]; then
|
||||
echo -n "$var_value" > "${ZABBIX_INTERNAL_ENC_DIR}/$var_name"
|
||||
file_name="${ZABBIX_INTERNAL_ENC_DIR}/${var_name}"
|
||||
fi
|
||||
|
||||
export "$var_name"="$file_name"
|
||||
|
||||
# Remove variable with plain text data
|
||||
unset "${var_name%%FILE}"
|
||||
}
|
||||
|
||||
# Check prerequisites for MySQL database
|
||||
check_variables() {
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
mysql_connect_args="-S ${DB_SERVER_SOCKET}"
|
||||
DB_SERVER_HOST="localhost"
|
||||
else
|
||||
: ${DB_SERVER_HOST:="mysql-server"}
|
||||
: ${DB_SERVER_PORT:="3306"}
|
||||
mysql_connect_args="-h ${DB_SERVER_HOST} -P ${DB_SERVER_PORT}"
|
||||
fi
|
||||
|
||||
file_env MYSQL_USER
|
||||
file_env MYSQL_PASSWORD
|
||||
|
||||
DB_SERVER_ZBX_USER=${MYSQL_USER:-"zabbix"}
|
||||
DB_SERVER_ZBX_PASS=${MYSQL_PASSWORD:-"zabbix"}
|
||||
|
||||
DB_SERVER_DBNAME=${MYSQL_DATABASE:-"zabbix"}
|
||||
|
||||
}
|
||||
|
||||
db_tls_params() {
|
||||
local result=""
|
||||
|
||||
if [ "${ZBX_DB_ENCRYPTION,,}" == "true" ]; then
|
||||
result="--ssl"
|
||||
|
||||
if [ -n "${ZBX_DB_CA_FILE}" ]; then
|
||||
result="${result} --ssl-ca=${ZBX_DB_CA_FILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DB_KEY_FILE}" ]; then
|
||||
result="${result} --ssl-key=${ZBX_DB_KEY_FILE}"
|
||||
fi
|
||||
|
||||
if [ -n "${ZBX_DB_CERT_FILE}" ]; then
|
||||
result="${result} --ssl-cert=${ZBX_DB_CERT_FILE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo $result
|
||||
}
|
||||
|
||||
get_vault_secrets() {
|
||||
WAIT_TIMEOUT=5
|
||||
vault_url="${ZBX_VAULTURL}${ZBX_VAULTPREFIX}${ZBX_VAULTDBPATH}"
|
||||
curl_opts=(-s -m 10 -k)
|
||||
|
||||
|
||||
if [ -z "${ZBX_VAULTURL}" ] || [ -z "${ZBX_VAULTPREFIX}" ] || [ -z "${ZBX_VAULTDBPATH}" ]; then
|
||||
echo "Missing variables! If ZBX_VAULT is used then ZBX_VAULTURL, ZBX_VAULTPREFIX and ZBX_VAULTDBPATH must be set"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "${ZBX_VAULT}" == "HashiCorp" ]; then
|
||||
while ! vaultdata="$(curl "${curl_opts[@]}" -H "X-Vault-Token: $VAULT_TOKEN" "$vault_url")"; do
|
||||
echo "**** Vault is not available. Waiting ${WAIT_TIMEOUT} seconds... ****"
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
errors=$(printf '%s' "$vaultdata" | jq -r '.errors // empty')
|
||||
if [ -n "${errors}" ]; then
|
||||
echo "Error getting secrets from vault: $errors"
|
||||
exit 1
|
||||
fi
|
||||
DB_SERVER_ZBX_USER="$(printf '%s' "$vaultdata" | jq -r '.data.data.username')"
|
||||
DB_SERVER_ZBX_PASS="$(printf '%s' "$vaultdata" | jq -r '.data.data.password')"
|
||||
|
||||
elif [ "${ZBX_VAULT}" == "CyberArk" ]; then
|
||||
cyberark_opts=(-H "Content-type: application/json" --cert "$ZBX_VAULTCERTFILE")
|
||||
|
||||
# if key is defined use it
|
||||
if [ -n "${ZBX_VAULTKEYFILE}" ]; then
|
||||
cyberark_opts+=(--key "$ZBX_VAULTKEYFILE")
|
||||
fi
|
||||
while ! vaultdata=$(curl "${curl_opts[@]}" "${cyberark_opts[@]}" "$vault_url") ; do
|
||||
echo "**** Vault is not available. Waiting ${WAIT_TIMEOUT} seconds... ****"
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
errors=$(printf '%s' "$vaultdata" | jq -r '.ErrorCode // empty')
|
||||
if [ -n "${errors}" ]; then
|
||||
echo "Error getting secrets from vault: $errors"
|
||||
exit 1
|
||||
fi
|
||||
DB_SERVER_ZBX_USER="$(printf '%s' "$vaultdata" | jq -r '.UserName')"
|
||||
DB_SERVER_ZBX_PASS="$(printf '%s' "$vaultdata" | jq -r '.Content')"
|
||||
|
||||
else
|
||||
echo "ZBX_VAULT has wrong value. HashiCorp or CyberArk are supported!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
check_db_connect() {
|
||||
echo "********************"
|
||||
echo "* DB_SERVER_HOST: ${DB_SERVER_HOST}"
|
||||
echo "* DB_SERVER_PORT: ${DB_SERVER_PORT}"
|
||||
if [ -n "${DB_SERVER_SOCKET}" ]; then
|
||||
echo "* DB_SERVER_SOCKET: ${DB_SERVER_SOCKET}"
|
||||
fi
|
||||
echo "* DB_SERVER_DBNAME: ${DB_SERVER_DBNAME}"
|
||||
if [ "${DEBUG_MODE,,}" == "true" ]; then
|
||||
echo "* DB_SERVER_ZBX_USER: ${DB_SERVER_ZBX_USER}"
|
||||
echo "* DB_SERVER_ZBX_PASS: ${DB_SERVER_ZBX_PASS}"
|
||||
fi
|
||||
echo "********************"
|
||||
|
||||
WAIT_TIMEOUT=5
|
||||
|
||||
if [ -n "${ZBX_VAULT}" ]; then
|
||||
unset DB_SERVER_ZBX_USER
|
||||
unset DB_SERVER_ZBX_PASS
|
||||
|
||||
echo "***** Connecting to vault... ******"
|
||||
echo "***** VAULT URL: $ZBX_VAULTURL"
|
||||
get_vault_secrets
|
||||
fi
|
||||
|
||||
ssl_opts="$(db_tls_params)"
|
||||
|
||||
export MYSQL_PWD="${DB_SERVER_ZBX_PASS}"
|
||||
|
||||
while [ ! "$(mariadb-admin ping $mysql_connect_args -u ${DB_SERVER_ZBX_USER} \
|
||||
--silent --skip-ssl-verify-server-cert --connect_timeout=10 $ssl_opts)" ]; do
|
||||
echo "**** MySQL server is not available. Waiting ${WAIT_TIMEOUT} seconds..."
|
||||
sleep $WAIT_TIMEOUT
|
||||
done
|
||||
|
||||
unset MYSQL_PWD
|
||||
}
|
||||
|
||||
prepare_web_server() {
|
||||
if [ "$(id -u)" == '0' ]; then
|
||||
export APACHE_RUN_USER=${DAEMON_USER}
|
||||
else
|
||||
export APACHE_RUN_USER=$(id -n -u)
|
||||
fi
|
||||
export APACHE_RUN_GROUP=${DAEMON_GROUP}
|
||||
|
||||
echo "** Adding Zabbix virtual host (HTTP)"
|
||||
if [ -f "$ZABBIX_CONF_DIR/apache.conf" ]; then
|
||||
ln -sfT "$ZABBIX_CONF_DIR/apache.conf" "$APACHE_SITES_DIR/zabbix.conf"
|
||||
else
|
||||
echo "**** Impossible to enable HTTP virtual host"
|
||||
fi
|
||||
|
||||
if [ -f "$APACHE_SSL_CONFIG_DIR/ssl.crt" ] && [ -f "$APACHE_SSL_CONFIG_DIR/ssl.key" ]; then
|
||||
echo "** Adding Zabbix virtual host (HTTPS)"
|
||||
if [ -f "$ZABBIX_CONF_DIR/apache_ssl.conf" ]; then
|
||||
ln -sfT "$ZABBIX_CONF_DIR/apache_ssl.conf" "$APACHE_SITES_DIR/zabbix_ssl.conf"
|
||||
else
|
||||
echo "**** Impossible to enable HTTPS virtual host"
|
||||
fi
|
||||
else
|
||||
echo "**** Impossible to enable SSL support for Apache2. Certificates are missed."
|
||||
fi
|
||||
|
||||
export HTTP_INDEX_FILE=${HTTP_INDEX_FILE:="index.php"}
|
||||
|
||||
: ${ENABLE_WEB_ACCESS_LOG:="true"}
|
||||
export APACHE_CUSTOM_LOG="/proc/self/fd/1"
|
||||
if [ "${ENABLE_WEB_ACCESS_LOG,,}" == "false" ]; then
|
||||
export APACHE_CUSTOM_LOG="/dev/null"
|
||||
fi
|
||||
|
||||
: ${EXPOSE_WEB_SERVER_INFO:="on"}
|
||||
export APACHE_SERVER_TOKENS="OS"
|
||||
export APACHE_SERVER_SIGNATURE="On"
|
||||
if [ "${EXPOSE_WEB_SERVER_INFO}" == "off" ]; then
|
||||
export APACHE_SERVER_TOKENS="Prod"
|
||||
export APACHE_SERVER_SIGNATURE="Off"
|
||||
fi
|
||||
|
||||
[ -z "${WEB_REAL_IP_FROM}" ] && sed -i '/WEB_REAL_IP_FROM/d' "$ZABBIX_CONF_DIR/apache.conf"
|
||||
[ -z "${WEB_REAL_IP_FROM}" ] && sed -i '/WEB_REAL_IP_FROM/d' "$ZABBIX_CONF_DIR/apache_ssl.conf"
|
||||
[ -z "${WEB_REAL_IP_HEADER}" ] && sed -i '/WEB_REAL_IP_HEADER/d' "$ZABBIX_CONF_DIR/apache.conf"
|
||||
[ -z "${WEB_REAL_IP_HEADER}" ] && sed -i '/WEB_REAL_IP_HEADER/d' "$ZABBIX_CONF_DIR/apache_ssl.conf"
|
||||
|
||||
mkdir -p "${APACHE_RUN_DIR}"
|
||||
}
|
||||
|
||||
prepare_zbx_php_config() {
|
||||
echo "** Preparing PHP configuration"
|
||||
|
||||
export PHP_FPM_PM=${PHP_FPM_PM:-"dynamic"}
|
||||
export PHP_FPM_PM_MAX_CHILDREN=${PHP_FPM_PM_MAX_CHILDREN:-"50"}
|
||||
export PHP_FPM_PM_START_SERVERS=${PHP_FPM_PM_START_SERVERS:-"5"}
|
||||
export PHP_FPM_PM_MIN_SPARE_SERVERS=${PHP_FPM_PM_MIN_SPARE_SERVERS:-"5"}
|
||||
export PHP_FPM_PM_MAX_SPARE_SERVERS=${PHP_FPM_PM_MAX_SPARE_SERVERS:-"35"}
|
||||
export PHP_FPM_PM_MAX_REQUESTS=${PHP_FPM_PM_MAX_REQUESTS:-"0"}
|
||||
|
||||
if [ "$(id -u)" == '0' ]; then
|
||||
echo "user = ${DAEMON_USER}" >> "$PHP_CONFIG_FILE"
|
||||
echo "group = ${DAEMON_GROUP}" >> "$PHP_CONFIG_FILE"
|
||||
echo "listen.owner = ${DAEMON_USER}" >> "$PHP_CONFIG_FILE"
|
||||
echo "listen.group = ${DAEMON_GROUP}" >> "$PHP_CONFIG_FILE"
|
||||
fi
|
||||
|
||||
: ${ZBX_DENY_GUI_ACCESS:="false"}
|
||||
export ZBX_DENY_GUI_ACCESS=${ZBX_DENY_GUI_ACCESS,,}
|
||||
export ZBX_GUI_ACCESS_IP_RANGE=${ZBX_GUI_ACCESS_IP_RANGE:-"['127.0.0.1']"}
|
||||
export ZBX_GUI_WARNING_MSG=${ZBX_GUI_WARNING_MSG:-"Zabbix is under maintenance."}
|
||||
|
||||
export ZBX_MAXEXECUTIONTIME=${ZBX_MAXEXECUTIONTIME:-"600"}
|
||||
export ZBX_MEMORYLIMIT=${ZBX_MEMORYLIMIT:-"128M"}
|
||||
export ZBX_POSTMAXSIZE=${ZBX_POSTMAXSIZE:-"16M"}
|
||||
export ZBX_UPLOADMAXFILESIZE=${ZBX_UPLOADMAXFILESIZE:-"2M"}
|
||||
export ZBX_MAXINPUTTIME=${ZBX_MAXINPUTTIME:-"300"}
|
||||
export PHP_TZ=${PHP_TZ}
|
||||
|
||||
export DB_SERVER_TYPE="MYSQL"
|
||||
test -z "${DB_SERVER_HOST}" || export DB_SERVER_HOST
|
||||
test -z "${DB_SERVER_PORT}" || export DB_SERVER_PORT
|
||||
test -z "${DB_SERVER_SOCKET}" || export DB_SERVER_SOCKET
|
||||
export DB_SERVER_DBNAME=${DB_SERVER_DBNAME}
|
||||
export DB_SERVER_SCHEMA=${DB_SERVER_SCHEMA}
|
||||
export DB_SERVER_USER=${DB_SERVER_ZBX_USER}
|
||||
export DB_SERVER_PASS=${DB_SERVER_ZBX_PASS}
|
||||
export ZBX_SERVER_HOST=${ZBX_SERVER_HOST}
|
||||
export ZBX_SERVER_PORT=${ZBX_SERVER_PORT}
|
||||
export ZBX_SERVER_NAME=${ZBX_SERVER_NAME}
|
||||
|
||||
: ${ZBX_DB_ENCRYPTION:="false"}
|
||||
export ZBX_DB_ENCRYPTION=${ZBX_DB_ENCRYPTION,,}
|
||||
export ZBX_DB_KEY_FILE=${ZBX_DB_KEY_FILE}
|
||||
export ZBX_DB_CERT_FILE=${ZBX_DB_CERT_FILE}
|
||||
export ZBX_DB_CA_FILE=${ZBX_DB_CA_FILE}
|
||||
: ${ZBX_DB_VERIFY_HOST:="false"}
|
||||
export ZBX_DB_VERIFY_HOST=${ZBX_DB_VERIFY_HOST,,}
|
||||
|
||||
export ZBX_VAULT=${ZBX_VAULT}
|
||||
export ZBX_VAULTURL=${ZBX_VAULTURL}
|
||||
export ZBX_VAULTPREFIX=${ZBX_VAULTPREFIX}
|
||||
export ZBX_VAULTDBPATH=${ZBX_VAULTDBPATH}
|
||||
export VAULT_TOKEN=${VAULT_TOKEN}
|
||||
export ZBX_VAULTCERTFILE=${ZBX_VAULTCERTFILE}
|
||||
export ZBX_VAULTKEYFILE=${ZBX_VAULTKEYFILE}
|
||||
|
||||
: ${DB_DOUBLE_IEEE754:="true"}
|
||||
export DB_DOUBLE_IEEE754=${DB_DOUBLE_IEEE754,,}
|
||||
|
||||
export ZBX_HISTORYSTORAGEURL=${ZBX_HISTORYSTORAGEURL}
|
||||
export ZBX_HISTORYSTORAGETYPES=${ZBX_HISTORYSTORAGETYPES:-"[]"}
|
||||
|
||||
export ZBX_SSO_SETTINGS=${ZBX_SSO_SETTINGS:-""}
|
||||
export ZBX_SSO_SP_KEY=${ZBX_SSO_SP_KEY}
|
||||
export ZBX_SSO_SP_CERT=${ZBX_SSO_SP_CERT}
|
||||
export ZBX_SSO_IDP_CERT=${ZBX_SSO_IDP_CERT}
|
||||
|
||||
: ${ZBX_ALLOW_HTTP_AUTH:="true"}
|
||||
export ZBX_ALLOW_HTTP_AUTH=${ZBX_ALLOW_HTTP_AUTH}
|
||||
|
||||
: ${ZBX_SERVER_TLS_ACTIVE:="0"}
|
||||
export ZBX_SERVER_TLS_ACTIVE=${ZBX_SERVER_TLS_ACTIVE}
|
||||
file_process_from_env "ZBX_SERVER_TLS_CAFILE" "${ZBX_SERVER_TLS_CAFILE}" "${ZBX_SERVER_TLS_CA}"
|
||||
file_process_from_env "ZBX_SERVER_TLS_KEYFILE" "${ZBX_SERVER_TLS_KEYFILE}" "${ZBX_SERVER_TLS_KEY}"
|
||||
file_process_from_env "ZBX_SERVER_TLS_CERTFILE" "${ZBX_SERVER_TLS_CERTFILE}" "${ZBX_SERVER_TLS_CERT}"
|
||||
export ZBX_SERVER_TLS_CERT_ISSUER=${ZBX_SERVER_TLS_CERT_ISSUER}
|
||||
export ZBX_SERVER_TLS_CERT_SUBJECT=${ZBX_SERVER_TLS_CERT_SUBJECT}
|
||||
}
|
||||
|
||||
prepare_zbx_config() {
|
||||
if [ -n "${ZBX_SESSION_NAME}" ]; then
|
||||
cp "$ZABBIX_WWW_ROOT/include/defines.inc.php" "/tmp/defines.inc.php_tmp"
|
||||
sed "/ZBX_SESSION_NAME/s/'[^']*'/'${ZBX_SESSION_NAME}'/2" "/tmp/defines.inc.php_tmp" > "$ZABBIX_WWW_ROOT/include/defines.inc.php"
|
||||
rm -f "/tmp/defines.inc.php_tmp"
|
||||
fi
|
||||
}
|
||||
|
||||
#################################################
|
||||
|
||||
echo "** Deploying Zabbix web-interface (Apache) with MySQL database"
|
||||
|
||||
check_variables
|
||||
check_db_connect
|
||||
prepare_zbx_php_config
|
||||
prepare_web_server
|
||||
prepare_zbx_config
|
||||
|
||||
echo "########################################################"
|
||||
|
||||
if [ "$1" != "" ]; then
|
||||
echo "** Executing '$@'"
|
||||
exec "$@"
|
||||
elif [ -f "/usr/bin/supervisord" ]; then
|
||||
echo "** Executing supervisord"
|
||||
exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
|
||||
else
|
||||
echo "Unknown instructions. Exiting..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#################################################
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue