]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
script: health-check: add health-check.sh default script
authorMarkus Valentin <markus.valentin@open-xchange.com>
Wed, 19 Jun 2019 14:29:49 +0000 (16:29 +0200)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 10 Sep 2019 07:01:45 +0000 (10:01 +0300)
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
src/util/health-check-settings.c [new file with mode: 0644]
src/util/health-check.sh [new file with mode: 0755]

index e1b522a1ec280d6d5f8b302baa789530cb7369fa..3e1dd8ff3b0c08298845a1d7c5b22042a8ce1c7e 100644 (file)
@@ -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 (file)
index 0000000..f673271
--- /dev/null
@@ -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 (executable)
index 0000000..119990f
--- /dev/null
@@ -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