From 31361b44e5d079ab7e968a2ac86faefb5d42bdc1 Mon Sep 17 00:00:00 2001 From: Markus Valentin Date: Wed, 19 Jun 2019 16:29:49 +0200 Subject: [PATCH] script: health-check: add health-check.sh default script As a example for an simple tcp health check the health-check.sh script is added. It closes the connection after 10 seconds and only answer to "PING\n" with a "PONG\n". It is installed by default next to the script executable. --- src/util/Makefile.am | 6 +++++- src/util/health-check-settings.c | 31 +++++++++++++++++++++++++++++++ src/util/health-check.sh | 26 ++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/util/health-check-settings.c create mode 100755 src/util/health-check.sh diff --git a/src/util/Makefile.am b/src/util/Makefile.am index e1b522a1ec..3e1dd8ff3b 100644 --- a/src/util/Makefile.am +++ b/src/util/Makefile.am @@ -45,7 +45,8 @@ script_LDADD = $(LIBDOVECOT) \ $(BINARY_LDFLAGS) script_DEPENDENCIES = $(LIBDOVECOT_DEPS) script_SOURCES = \ - script.c + script.c \ + health-check-settings.c if TCPWRAPPERS TCPWRAP_BIN = tcpwrap @@ -71,3 +72,6 @@ maildirlock_LDADD = $(LIBDOVECOT) \ maildirlock_DEPENDENCIES = $(LIBDOVECOT_DEPS) maildirlock_SOURCES = \ maildirlock.c + +pkglibexec_SCRIPTS = health-check.sh +EXTRA_DIST = $(pkglibexec_SCRIPTS) diff --git a/src/util/health-check-settings.c b/src/util/health-check-settings.c new file mode 100644 index 0000000000..f6732719bb --- /dev/null +++ b/src/util/health-check-settings.c @@ -0,0 +1,31 @@ +/* Copyright (c) 2019 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "buffer.h" +#include "settings-parser.h" +#include "service-settings.h" + +struct service_settings health_check_service_settings = { + .name = "health-check", + .protocol = "", + .type = "", + .executable = "script -p health-check.sh", + .user = "$default_internal_user", + .group = "", + .privileged_group = "", + .extra_groups = "", + .chroot = "", + + .drop_priv_before_exec = TRUE, + + .process_min_avail = 0, + .process_limit = 0, + .client_limit = 1, + .service_count = 0, + .idle_kill = 0, + .vsz_limit = (uoff_t)-1, + + .unix_listeners = ARRAY_INIT, + .fifo_listeners = ARRAY_INIT, + .inet_listeners = ARRAY_INIT +}; diff --git a/src/util/health-check.sh b/src/util/health-check.sh new file mode 100755 index 0000000000..119990fb42 --- /dev/null +++ b/src/util/health-check.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2019 Dovecot authors, see the included COPYING file */ +# +# This script is intended to be called by the script service and to be +# connected to a socket using a service configuration like this: +# executable = script -p /path/to/health-check.sh +# +# This simple example merely answers "PONG\n" if the input is "PING\n". It +# stops waiting for input after $TIMEOUT which causes the process to die +# which causes the script module to close the socket. Inputs and outputs +# can be written to STDIN and STDOUT, they are duplicated file-descriptors +# if called from the script service. + +TIMEOUT=10 + +read -t ${TIMEOUT} -r input + +exit_code=$? +cleaned_input=${input//[^a-zA-Z0-9]/} + +if [ $exit_code -eq 0 ] && [ "$cleaned_input" = "PING" ];then + echo "PONG" +fi +# always exit successful +exit 0 -- 2.47.3