about summary refs log tree commit diff
path: root/bundles/svtree-containers/files/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/svtree-containers/files/bin')
-rwxr-xr-xbundles/svtree-containers/files/bin/podman-healthcheck32
-rwxr-xr-xbundles/svtree-containers/files/bin/podman-healthcheckd34
2 files changed, 66 insertions, 0 deletions
diff --git a/bundles/svtree-containers/files/bin/podman-healthcheck b/bundles/svtree-containers/files/bin/podman-healthcheck
new file mode 100755
index 0000000..ab3dcc7
--- /dev/null
+++ b/bundles/svtree-containers/files/bin/podman-healthcheck
@@ -0,0 +1,32 @@
+#!/bin/sh
+set -eu
+[ -n "${DEBUG:-}" ] && set -x
+
+healthcheck() {
+	local container=${1:?}
+
+	podman healthcheck run "$container" >/dev/null 2>&1 || true
+
+	podman inspect --format '{{if .State.Health}}{{.Name}} {{.State.Health.Status}}{{end}}' "$container" | (
+		read -r name status
+
+		test -n "$name" || return
+
+		printf '%s (%s) is %s\n' "$container" "$name" "$status"
+		case "$status" in
+		healthy) ;;
+		*)
+			# tgnotify "!!! service $container unhealthy"
+			;;
+		esac
+	)
+}
+
+main() {
+	case "${1:-}" in
+	"") podman container ls --format '{{.ID}}' | xargs -n1 $0 ;;
+	*) healthcheck "$1" ;;
+	esac
+}
+
+main $@
diff --git a/bundles/svtree-containers/files/bin/podman-healthcheckd b/bundles/svtree-containers/files/bin/podman-healthcheckd
new file mode 100755
index 0000000..cdbef0e
--- /dev/null
+++ b/bundles/svtree-containers/files/bin/podman-healthcheckd
@@ -0,0 +1,34 @@
+#!/bin/sh
+set -eu
+[ -n "${DEBUG:-}" ] && set -x
+
+healthcheck_with_retry() {
+	local container="${1:-}"
+
+	podman inspect --format '{{with .Config.Healthcheck}}{{.StartPeriod}} {{.Timeout}} {{.Retries}}{{end}}' "$container" |
+		(
+			read -r start_period timeout retries
+			test -n "$start_period$timeout$retries" || return
+
+			sleep "$start_period"
+
+			podman-healthcheck "$container" && return
+
+			count=0
+			while [ "$count" -lt "$retries" ]; do
+				sleep "$timeout"
+				podman-healthcheck "$container" && return
+				count=$((count + 1))
+			done
+		)
+
+}
+
+main() {
+	podman events --filter 'type=container' --filter 'event=start' --format '{{.ID}}' |
+		while read -r container; do
+			healthcheck_with_retry "$container" || true
+		done
+}
+
+main $@